大白话简单工厂模式 (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 无工厂模式类图
由上图可以发现
- 4s店职责过多,不仅需要销售,还需要制造汽车,明白如何生产某型号的汽车。
- 耦合严重,如果需要发布新的车型,还需要对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
推荐阅读
-
工厂方法模式(Factory Method Pattern)
-
Net设计模式实例之简单工厂模式(Simple Factory Pattern)
-
大白话简单工厂模式 (Simple Factory Pattern)
-
大白话工厂方法模式(Factory Method)
-
设计模式之工厂模式(factory pattern)
-
抽象工厂模式(Abstract Factory Pattern)
-
简单工厂模式(Simple Factory Pattern)
-
抽象工厂模式(Abstract Factory Pattern)
-
PHP语言工厂模式(Factory Pattern)
-
【设计模式】简单工厂模式 Simple Factory Pattern