概述

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊

简单工厂

介绍

简单工厂模式又叫静态工厂方法(Static Factory Method)是属于创建型模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪种产品的实例。简单工厂模式是工厂模式家族最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

适用场景

简单工厂适合产品对象较少,且产品固定的需求

简单工厂实现

该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象:


Phone类 :手机标准规范类(AbstractProduct)

public interface Phone {void make();
}

MiPhone类 :制造小米手机(Product1)

public class MiPhone implements Phone {@Overridepublic void make() {System.out.println("make xiaomi phone!");}
}

IPhone类 :制造苹果手机(Product2)

public class MiPhone implements Phone {@Overridepublic void make() {System.out.println("make xiaomi phone!");}
}

PhoneFactory类 :手机代工厂(Factory)

public class PhoneFactory {/*** 创建手机* @param phoneType MiPhone,iPhone* @return*/public Phone makePhone(String phoneType){if(phoneType.equalsIgnoreCase("MiPhone")){return new MiPhone();}else if(phoneType.equalsIgnoreCase("iPhone")) {return new IPhone();}return null;}}

演示

public class Demo {public static void main(String[] args) {PhoneFactory factory = new PhoneFactory();// make xiaomi phone!MiPhone miPhone = (MiPhone) factory.makePhone("MiPhone");miPhone.make();// make iphone!IPhone iPhone = (IPhone)factory.makePhone("iPhone");iPhone.make();}
}

优点 & 缺点

优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则

工厂方法模式

介绍

工厂方法模式(Factory Method)又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所以产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品应当被实例化的细节。

适用场景

工厂方法模式是简单工厂的衍生,解决了许多简单工厂的问题。首先完全实现“开-闭原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结构复杂的场合

工厂方法实现

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂:

也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

接下来继续使用生产手机的例子来讲解该模式。

其中和产品相关的Phone类、MiPhone类和IPhone类的定义不变

AbstractFactory类 :生产不同产品的工厂的抽象类

public interface AbstractFactory {Phone makePhone();
}

XiaoMiFactory类 :生产小米手机的工厂(ConcreteFactory1)

public class XiaoMiFactory implements AbstractFactory {@Overridepublic Phone makePhone() {return new MiPhone();}
}

AppleFactory类 :生产苹果手机的工厂(ConcreteFactory2)

public class AppleFactory implements AbstractFactory {@Overridepublic Phone makePhone() {return new IPhone();}
}

演示

public class Demo {public static void main(String[] args) {AbstractFactory miFactory = new XiaoMiFactory();AbstractFactory appleFactory = new AppleFactory();// make xiaomi phone!MiPhone miPhone= (MiPhone) miFactory.makePhone();miPhone.make();// make iphone!IPhone iPhone= (IPhone) appleFactory.makePhone();iPhone.make();}
}

优点 & 缺点

优点:

  • 子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。
  • 加一层间接性,增加了灵活性
  • 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
  • 多态性:客户代码可以做到与特定应用无关,适用于任何实体类

缺点:

需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次

抽象工厂模式(Abstract Factory)

上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果要生成另一种产品PC,应该怎么表示呢?

最简单的方式是把2中介绍的工厂方法模式完全复制一份,不过这次生产的是PC。但同时也就意味着我们要完全复制和修改Phone生产管理的所有代码,显然这是一个笨办法,并不利于扩展和维护。

抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。


从上面类图结构中可以清楚的看到如何在工厂方法模式中通过增加新产品接口来实现产品的增加的。

接下来我们继续通过小米和苹果产品生产的例子来解释该模式。

为了弄清楚上面的结构,我们使用具体的产品和工厂来表示上面的UML类图,能更加清晰的看出模式是如何演变的:

适用场景

当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点

抽象工厂实现

PC类 :定义PC产品的接口(AbstractPC)

public interface PC {void make();
}

MiPC类 :定义小米电脑产品(MIPC)

public class MiPC implements PC{@Overridepublic void make() {System.out.println("make xiaomi PC!");}
}

MAC类 :定义苹果电脑产品(MAC)

public class MAC implements PC{@Overridepublic void make() {System.out.println("make MAC!");}
}

下面需要修改工厂相关的类的定义:

AbstractFactory类 :增加PC产品制造接口

public interface AbstractFactory {Phone makePhone();PC makePC();
}

XiaoMiFactory类 :增加小米PC的制造(ConcreteFactory1)

public class XiaoMiFactory implements AbstractFactory {@Overridepublic Phone makePhone() {return new MiPhone();}@Overridepublic PC makePC() {return new MiPC();}
}

AppleFactory类 :增加苹果PC的制造(ConcreteFactory2)

public class AppleFactory implements AbstractFactory {@Overridepublic Phone makePhone() {return new IPhone();}@Overridepublic PC makePC() {return new MAC();}
}

演示

public class Demo {public static void main(String[] args) {AbstractFactory miFactory =  new XiaoMiFactory();AbstractFactory appleFactory = new AppleFactory();// make xiaomi phone!MiPhone miPhone = (MiPhone) miFactory.makePhone();miPhone.make();// make xiaomi PC!MiPC miPC = (MiPC) miFactory.makePC();miPhone.make();// make iphone!IPhone iPhone = (IPhone) appleFactory.makePhone();iPhone.make();// make MAC!MAC mac = (MAC) appleFactory.makePC();mac.make();}
}

优点 & 缺点

优点:
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理

缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的

设计模式 ---- 工厂模式相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

  5. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  6. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  7. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  8. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  9. 设计模式-工厂模式(学习)

    设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...

  10. 设计模式-工厂模式的3中不同实现[JAVA]

    设计模式-工厂模式的3中不同实现[JAVA] 工厂模式简介 In Factory pattern, we create object without exposing the creation log ...

最新文章

  1. 机器学习—决策树构造算法的python实现
  2. js 获取当前时间 随记
  3. QGIS简介与源代码编译
  4. 崩溃了,一个HashMap跟面试官扯了半个小时
  5. elasticsearch7.9.2 安装配置
  6. 用 Docker Machine 创建 Azure 虚拟主机
  7. mybatis字符串模糊匹配
  8. 清理操作系统垃圾批处理文件
  9. 9.logstash
  10. Atitit 下推自动机﹙PDA﹚说明书 目录 1. 概念组成与原理成分 1 2. 性状 1 3. 适用场景 主治 适应症 1 3.1. 所有场景()。 1 3.2. 语法解析 构建ast 2 3.
  11. 《视觉SLAM十四讲》笔记
  12. 自动控制理论(9)——奈奎斯特稳定判据
  13. js html title属性,HTML DOM title 属性
  14. 纯css单击事件,纯css实现点击事件
  15. ppt的字母上面插入尖号
  16. 敏涵控股集团董事长刘敏:品牌敏涵 用心做企业
  17. 10分钟教你搭建一个好玩的Python全文搜索引擎
  18. GPS定位及获取卫星参数实例整理
  19. 独立、原创、总结、分享、行动——由海滨学生參观实验室及“飞思卡尔”杯智能车比赛想到的...
  20. 滑动刻度尺 身高体重腰围

热门文章

  1. 【操作系统】虚拟地址和页表项的关系
  2. linux环境下使用sort命令完成常见排序操作
  3. 费诺编码 c++代码实现 信息论实验
  4. VSCode 环境配置管理
  5. web安全之信息刺探防范(下)
  6. 对于人脸识别检测中出现遮挡问题的解决方案
  7. zedboard移植linux内核,[干货]手把手教你用Zedboard学习Linux移植和驱动开发
  8. 计算机网络——3A安全认证
  9. mt6592android7,MT6592/MT6592M/MT6592T三版本性能对比
  10. git tag怎么使用_这才是真正的Git——Git内部原理揭秘!