zoukankan      html  css  js  c++  java
  • 设计模式学习笔记三:工厂方法模式

    上篇文章讲到了简单工厂模式(Factory method)

    本人将按照上篇文章的场景继续讨论,若想了解请移至这里

    场景只是为了引申出主题,不具有实际意义,请谅解业务逻辑不完整之处,以后可能会再进行润色,咱只是不希望把一个模式说的没有依据。

        随着公司领导有方与同事努力奋斗,公司的业绩越来越好,不同的业务线有了新的变化,以满足公司的长足发展。

            机票组细分为了国内机票、海外机票;

            酒店组细分了国内酒店、海外酒店;

            门票组细分了景点门票、赛事门票;

            度假组细分了......


        这个时候我们发现,现有的系统需要在业务层面上继续分离,在系统结构上也需要有所变动。也就是说我们要修改系统达到这样一个目的,根据同一个产品的不同类型创建订单,而订单的创建则有是一个具体的工厂的创建。我们还是用原来的订单控制中心,只不过把订单创建延迟到子类中进行。


    代码如下:

    1、订单中心,现在变成了抽象类,将creteOrder方法移回来并变成抽象方法。

    /* 
     * OrderProcessCenter.java 1.0 2014/08/11 
     *  
     * 声明:欢迎转载,请注明出处。 
     *  
     */  
    
    package com.liushijie.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.liushijie.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.liushijie.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.liushijie.facotry_method;
    
    public class ChinaAirOrder extends Order{
        public ChinaAirOrder() {
            System.out.println("create a ChinaAirOrder...");
        }
    }
    
    package com.liushijie.facotry_method;
    
    public class ChinaHotelOrder extends Order{
        public ChinaHotelOrder() {
            System.out.println("create a ChinaHotelOrder...");
        }
    }
    
    package com.liushijie.facotry_method;
    
    public class ChinaTicketOrder extends Order{
        public ChinaTicketOrder() {
            System.out.println("create a ChinaTicketOrder...");
        }
    }
    
    package com.liushijie.facotry_method;
    
    public class ForeignAirOrder extends Order {
        @Override
        public void pay() {  // 覆盖了支付方式,使用visa以支持国际支付
            System.out.println("VISA paid...");
        }
    }
    
    package com.liushijie.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.liushijie.facotry_method;
    
    public class ForeignTicketOrder extends Order {
        public ForeignTicketOrder() {
            System.out.println("create a ForeignTicketOrder...");
        }
    }

    4、OK,至此我们的订单逻辑已经完成,下面下2张单测试一下:

    package com.liushijie.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...

    输出正常,是我们想要的结果。从此码农们可以专心搞一个模块了。业务也清晰了。每个业务线都能独立处理自己的逻辑。简单工厂模式的时候,我们是无法选择国内或者国外等类型的,而在订单中心中我们可以选择使用哪种工作生产产品。

    文章仅供个人学习记录,有不到之处还请指正。

  • 相关阅读:
    分解质因数
    大素数测试和分解质因数
    快速幂
    欧拉函数
    素数
    gcd,lcm,ext_gcd,inv
    凸包问题 poj 2187
    map的 简单用法
    判断线段是否在园内
    2-sat 问题
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712926.html
Copyright © 2011-2022 走看看