zoukankan      html  css  js  c++  java
  • 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern)

    从买车经历说起

    毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车。逛了多家4S店,最终定下日产某车型的轿车。4S店接受订单后,向工厂说明车型,工厂随后进行汽车制造,运输到4S店中再到了小两口的手上,小两口终于成了有车一族。
    仔细分析,4S销售模式即为典型的简单工厂模式。下面从代码的角度进行分析。

    无工厂模式

    首先,我们先分析4S店最初的模式(企业个人作坊阶段,无工厂)。4S店卖车首先要有车,这里只取日产部分车型逍客,轩逸和天籁。

    代码片段1 日产车父类,所有车型都继承此类。

    /**
     * 日产车
     * @author coderzcr
     */
    abstract class NissanCar {
        String name;
        void printCar(){
            System.out.println(name+"汽车已制造完成");
        }
    }
    
    

    代码片段2 车型:逍客

    /**
     * 车型:逍客
     * @author coderzcr
     */
    class Xtrail extends NissanCar {
        Xtrail(){
            this.name = "逍客";
        }
    }
    

    代码片段3 车型:轩逸

    /**
     * 车型:轩逸
     * @author coderzcr
     */
    class Sylphy extends NissanCar {
        Sylphy(){
            this.name = "轩逸";
        }
    }
    

    代码片段4 车型:天籁

    /**
     * 车型:天籁
     * @author coderzcr
     */
    class Altima extends NissanCar {
        Altima(){
            this.name="天籁";
        }
    }
    

    代码片段5 无工厂的4S店

    /**
     * 4s店
     * @author coderzcr
     */
    class FourS {
        /**
         * 获取汽车
         * @param type 汽车型号
         */
        void getCar(String type) {
            NissanCar nissanCar = null;
            if ("1".equals(type)) {
                nissanCar = new Xtrail();
            } else if ("2".equals(type)) {
                nissanCar = new Sylphy();
            } else if ("3".equals(type)) {
                nissanCar = new Altima();
            }
            assert nissanCar != null;
            nissanCar.printCar();
        }
    
    }
    
    

    图片1 无工厂模式类图
    无工厂模式类图
    由上图可以发现

    1. 4S店职责过多,不仅需要销售,还需要制造汽车,明白如何生产某型号的汽车。
    2. 耦合严重,如果需要发布新的车型,还需要对4S进行修改(即学习更多的车型制造),无疑增大了4S店的压力。

    随着企业的发展,企业认识到了问题的严重性,开始设立工厂。工厂负责制造汽车,4S店负责销售汽车,只需告知工厂型号即可获取汽车。

    代码片段6 汽车工厂

    /**
     * 日产车工厂
     * @author coderzcr
     */
    public class NissanCarFactory {
        /**
         * 生产汽车
         * @param type 汽车型号
         */
        NissanCar createCar(String type) {
            NissanCar nissanCar = null;
            if ("1".equals(type)) {
                nissanCar = new Xtrail();
            } else if ("2".equals(type)) {
                nissanCar = new Sylphy();
            } else if ("3".equals(type)) {
                nissanCar = new Altima();
            }
            return nissanCar;
        }
    }
    
    

    代码片段7 有工厂的4S店。

    /**
     * 有工厂的4S店。
     *
     * @author coderzcr
     */
    class FourS {
    
        NissanCarFactory nissanCarFactory;
    
        FourS(NissanCarFactory nissanCarFactory) {
            this.nissanCarFactory = nissanCarFactory;
        }
    
        /**
         * 获取汽车
         *
         * @param type 汽车型号
         */
        void getCar(String type) {
            NissanCar nissanCar =  nissanCarFactory.createCar(type);
            nissanCar.printCar();
        }
    }
    

    图片2 有工厂模式类图
    有工厂模式类图

    经过改造,4S店和工厂的职责进行了分离,减轻了4S店的压力。当发布新车型时,只需了解其型号告知工厂即可获取到相应车辆。

    简单工厂模式定义

    简单工厂模式(Simple Factory Pattern):属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    已上面举例来解释的话就是根据车型的不同制造不同型号的车。日产专门建造一个工厂来负责制造汽车,被创造的汽车都是日产车型。

    简单工厂模式结构

    简单工厂模式包含如下角色:

    • Factory:工厂角色
      工厂角色负责实现创建所有实例的内部逻辑。例子中得日产工厂(NissanFactory)
    • Product:抽象产品角色
      抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。例子中的日车车(NissanCar)
    • ConcreteProduct:具体产品角色
      具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。例子中的逍客,轩逸,天籁。(Xtrail、Sylphy、Altima)

    图片3 简单工厂模式
    简单工厂模式类图

    简单工厂模式分析

    将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。

    简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的

    简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节

    参考文献

    1. 简单工厂模式( Simple Factory Pattern ) — Graphic Design Patterns

  • 相关阅读:
    Struts2拦截器defaultStack与paramsPrepareParamsStack
    Java中的数据类型BigDecimal
    JfreeChart报表数据点显示、链接
    JPA+Hibernate3 CRUD(增删改查操作)
    Ibatis的批量处理iterateiterate标签
    .net中split的用法,asp.net字符分隔
    存储过程中RETURN语句的返回值
    SQL自定义函数学习修改和删除和管理
    SqlCommand 方法
    由于该计算机受到限制本次操作已被取消请与你的系统管理员联系
  • 原文地址:https://www.cnblogs.com/zcr3108346262/p/12076945.html
Copyright © 2011-2022 走看看