大白话简单工厂模式 (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

(0)

相关推荐

  • 【Wolfram 到底有多厉害】- 神奇代码系列 04

    书接上文: 原作者是Martin Büttner, 由知乎回答者 AlephAlpha 汉化翻译, 这里已或授权转发, 并且我再整理补充一点内容, 中文链接您可以在最下阅读原文找到链接. 另外,这里的 ...

  • 大白话工厂方法模式(Factory Method)

    目录 简单工厂模式缺陷 简单工厂模式改造 工厂方法模式定义 工厂方法模式结构 工厂方法模式分析 优点分析 缺点分析 参考文献 简单工厂模式缺陷 大白话简单工厂模式(Simple Factory Pat ...

  • 2000匹的日产天籁漂移战车,你见过吗? | 酷乐汽车

    # CLAUTO / 酷乐汽车 # # 日产 # # Altima # # 漂移 # 日产的Altima大家应该都听说过,也就是国内的天籁,号称日产大沙发的舒适型轿车,在改装达人眼里,就变成了一台漂移 ...

  • 简单工厂模式(Simple Factory Pattern)

    定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法( ...

  • 工厂模式(Factory Pattern)

    Factory Pattern 创造型设计模式,提供一个创造对象的方式,在工厂模式中,创造对象的逻辑不对外暴露创建,只提供一个创建的接口. 定义一个创建对象的接口,其子类决定去创建哪一个实例对象,创建 ...

  • 设计模式之工厂模式(factory pattern)

    工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创建型模式.本文从一 ...

  • 抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...

  • 【6/25】使用简单工厂模式(Simple Factory Pattern)改写Page基类

    这是<小游戏从0到1设计模式重构>系列内容第6篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 工厂模式有三个姐妹:简单工厂模 ...

  • PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  • [PHP小课堂]PHP设计模式之简单工厂模式

    PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 【C++设计模式一】C++简单工厂模式

    (1)定义 定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类. (2)结构 简单工厂模式有以下的结构: 工厂(Factory):根据客户提供的具体产品类的参数 ...

  • 【重温设计模式】之002简单工厂模式

    [重温设计模式系列源码] 简单工厂模式 基本原理 含义 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法). 在现实生活中,工厂是生产产品的, 同样的,在设计模式中,一个负责生产" ...