设计模式学习笔记三:工厂方法模式
2014-08-12 23:13
441 查看
上篇文章讲到了简单工厂模式(Factory method)
本人将按照上篇文章的场景继续讨论,若想了解请移至:http://blog.csdn.net/array7/article/details/38499739。
场景只是为了引申出主题,不具有实际意义,请谅解业务逻辑不完整之处,以后可能会再进行润色,咱只是不希望把一个模式说的没有依据。
随着公司领导有方与同事努力奋斗,公司的业绩越来越好,不同的业务线有了新的变化,以满足公司的长足发展。
机票组细分为了国内机票、海外机票;
酒店组细分了国内酒店、海外酒店;
门票组细分了景点门票、赛事门票;
度假组细分了......
这个时候我们发现,现有的系统需要在业务层面上继续分离,在系统结构上也需要有所变动。也就是说我们要修改系统达到这样一个目的,根据同一个产品的不同类型创建订单,而订单的创建则有是一个具体的工厂的创建。我们还是用原来的订单控制中心,只不过把订单创建延迟到子类中进行。
代码如下:
1、订单中心,现在变成了抽象类,将creteOrder方法移回来并变成抽象方法。
2、具体的工厂继承上面的订单中心类,实现指定类型的订单工厂:
3、创建具体的订单:
4、OK,至此我们的订单逻辑已经完成,下面下2张单测试一下:
输出:
输出正常,是我们想要的结果。从此码农们可以专心搞一个模块了。业务也清晰了。每个业务线都能独立处理自己的逻辑。简单工厂模式的时候,我们是无法选择国内或者国外等类型的,而在订单中心中我们可以选择使用哪种工作生产产品。
文章仅供个人学习记录,有不到之处还请指正。
后续会慢慢润色力求精准全面。
本人将按照上篇文章的场景继续讨论,若想了解请移至:http://blog.csdn.net/array7/article/details/38499739。
场景只是为了引申出主题,不具有实际意义,请谅解业务逻辑不完整之处,以后可能会再进行润色,咱只是不希望把一个模式说的没有依据。
随着公司领导有方与同事努力奋斗,公司的业绩越来越好,不同的业务线有了新的变化,以满足公司的长足发展。
机票组细分为了国内机票、海外机票;
酒店组细分了国内酒店、海外酒店;
门票组细分了景点门票、赛事门票;
度假组细分了......
这个时候我们发现,现有的系统需要在业务层面上继续分离,在系统结构上也需要有所变动。也就是说我们要修改系统达到这样一个目的,根据同一个产品的不同类型创建订单,而订单的创建则有是一个具体的工厂的创建。我们还是用原来的订单控制中心,只不过把订单创建延迟到子类中进行。
代码如下:
1、订单中心,现在变成了抽象类,将creteOrder方法移回来并变成抽象方法。
/* * OrderProcessCenter.java 1.0 2014/08/11 * * 声明:欢迎转载,请注明出处。 * */ package com.array7.facotry_method; /** * 订单中心,负责对所有类型的订单进行控制 * @author array7 * */ public abstract class OrderProcessCenter { public Order orderFlow(String type) { // Order order = new SimpleOrderFactory().createOrder(type); Order order = this.createOrder(type); order.pay(); order.notifyCustomer(); order.finish(); return order; } public abstract Order createOrder(String type); }
2、具体的工厂继承上面的订单中心类,实现指定类型的订单工厂:
package com.array7.facotry_method; public class ChinaOrderProcessCenter extends OrderProcessCenter{ @Override public Order createOrder(String type) { Order order = null; if ("air".equals(type)) { order = new ChinaAirOrder(); } else if ("hotel".equals(type)) { order = new ChinaHotelOrder(); } else if ("ticket".equals(type)) { order = new ChinaTicketOrder(); } else if ("xxx".equals(type)) { // TODO: some thing } else if ("yyy".equals(type)) { // TODO: some thing } else if ("zzz".equals(type)) { // TODO: some thing } else if ("123".equals(type)) { // TODO: some thing } return order; } } package com.array7.facotry_method; public class ForeignOrderProcessCenter extends OrderProcessCenter{ @Override public Order createOrder(String type) { Order order = null; if ("air".equals(type)) { order = new ForeignAirOrder(); } else if ("hotel".equals(type)) { order = new ForeignHotelOrder(); } else if ("ticket".equals(type)) { order = new ForeignTicketOrder(); } else if ("xxx".equals(type)) { // TODO: some thing } else if ("yyy".equals(type)) { // TODO: some thing } else if ("zzz".equals(type)) { // TODO: some thing } else if ("123".equals(type)) { // TODO: some thing } return order; } }
3、创建具体的订单:
package com.array7.facotry_method; public class ChinaAirOrder extends Order{ public ChinaAirOrder() { System.out.println("create a ChinaAirOrder..."); } } package com.array7.facotry_method; public class ChinaHotelOrder extends Order{ public ChinaHotelOrder() { System.out.println("create a ChinaHotelOrder..."); } } package com.array7.facotry_method; public class ChinaTicketOrder extends Order{ public ChinaTicketOrder() { System.out.println("create a ChinaTicketOrder..."); } } package com.array7.facotry_method; public class ForeignAirOrder extends Order { @Override public void pay() { // 覆盖了支付方式,使用visa以支持国际支付 System.out.println("VISA paid..."); } } package com.array7.facotry_method; public class ForeignHotelOrder extends Order { public ForeignHotelOrder() { System.out.println("create a ForeignHotelOrder..."); } @Override public void pay() { // 覆盖了支付方式,使用visa以支持国际支付 System.out.println("Visa paid..."); } } package com.array7.facotry_method; public class ForeignTicketOrder extends Order { public ForeignTicketOrder() { System.out.println("create a ForeignTicketOrder..."); } }
4、OK,至此我们的订单逻辑已经完成,下面下2张单测试一下:
package com.array7.facotry_method; public class Test { public static void main(String[] args) { // 创建一个国内酒店订单 OrderProcessCenter chinaOrderCenter = new ChinaOrderProcessCenter(); chinaOrderCenter.orderFlow("hotel"); // 创建一个国外订单 OrderProcessCenter foreignderCenter = new ForeignOrderProcessCenter(); foreignderCenter.orderFlow("hotel"); } }
输出:
create a ChinaHotelOrder... paid... done... finished... create a ForeignHotelOrder... Visa paid... done... finished...
输出正常,是我们想要的结果。从此码农们可以专心搞一个模块了。业务也清晰了。每个业务线都能独立处理自己的逻辑。简单工厂模式的时候,我们是无法选择国内或者国外等类型的,而在订单中心中我们可以选择使用哪种工作生产产品。
文章仅供个人学习记录,有不到之处还请指正。
后续会慢慢润色力求精准全面。
相关文章推荐
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式学习笔记(五):工厂方法模式
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式学习笔记(3)工厂方法
- 设计模式学习笔记-工厂方法
- 设计模式学习笔记三:工厂方法模式
- C++设计模式学习笔记五:工厂方法模式
- 设计模式学习笔记:抽象工厂和工厂方法的区别
- 设计模式学习笔记——工厂方法(Factory Method)
- 设计模式学习笔记:factory method(工厂方法)
- [设计模式学习笔记二][创建型模式][工厂方法(Factory Method)]
- Java设计模式之工厂方法模式——学习笔记
- java设计模式学习笔记之工厂方法模式
- iOS学习笔记(5)——设计模式之工厂方法、抽象工厂
- 设计模式笔记-创建型模式之三--工厂方法:Factory Method
- HeadFirst 设计模式学习笔记4--工厂模式
- 设计模式学习笔记(十六)——Template Method模板方法模式
- 学习笔记之设计模式:抽象工厂
- 设计模式学习笔记——简单工厂(Simple Factory)
- 简单工厂模式(未完成)——小鸟学习设计模式笔记系列