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...

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

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

  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712926.html
Copyright © 2011-2022 走看看