简单工厂模式,工厂方法模式,抽象工厂模式总结-java版

文章目录

    • LOG:更新日志
    • 一、简单工厂模式,工厂方法模式,抽象工厂模式定义
    • 二、三种工厂模式的优缺点以及适用场景
    • 三、名词解释
    • 四、简单工厂模式、工厂方法模式与抽象工厂模式之间的区别
    • 五、抽象工厂模式的两种情况:①符合开闭原则;②不符合开闭原则
    • 六、三种模式例子java实现代码
    • 七、个人简单总结

LOG:更新日志

  • 2019-3-29 第一次完成此文章V1.0.0版本
  • 2019-4-10 更新标题,增加了“java版”字样,文章版本更新至V1.0.1

一、简单工厂模式,工厂方法模式,抽象工厂模式定义

模式 定义
简单工厂模式 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
工厂方法模式 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类
抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

PS:简单工厂模式不是GOF 23种设计模式之一!它只是日常编程中一种常用的方法或者说是这是一种习惯。

PS:文中部分看不懂的名词文末都有解释。

二、三种工厂模式的优缺点以及适用场景

简单工厂模式优缺点以及适用场景

  • 优点

    1. 实现了对象创建和使用的分离(即业务逻辑和界面逻辑分离)。
    2. 客户端无需知道所创建的具体产品类的类名,只需知道具体产品类所对应的参数即可。
    3. 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
  • 缺点

    1. 工厂类集中了所有产品的逻辑,职责过重,一旦不能工作,整个系统都要受到影响。
    2. 增加系统中类的个数,增加了系统的复杂度和理解难度。
    3. 系统扩展困难,一旦添加新产品不得不修改工厂逻辑。
    4. 由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展。
  • 适用环境

    1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
    2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

工厂方法模式优缺点以及适用场景

  • 优点

    1. 符合开放-关闭原则(简称开-闭原则)
    2. 将创建对象的逻辑与任务交给了工厂类
  • 缺点

    1. 每次新增产品,产品类都需要创建对应工厂类,增加了系统的开销
  • 适用场景

    1. 创建某些类的对象的逻辑比较复杂, 并且有很多分支条件,而且还可能增加新的条件。
    2. 一个类不知道它所需要的对象的类 。
    3. 一个类通过其子类来指定创建哪个对象。
    4. 需要封装创建类的对象的逻辑, 使得这些逻辑局部化。

抽象工厂模式优缺点以及适用场景

  • 优点

    1. 隔离了具体类的生成, 使得客户端并不需要知道什么被创建。

    2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

    3. 增加新的产品族很方便,无须修改已有系统,符合开闭原则

      PS:抽象工厂模式有符合开闭原则的情况,也有不符合开闭原则的情况!!!
      PS:抽象工厂模式有符合开闭原则的情况,也有不符合开闭原则的情况!!!
      PS:抽象工厂模式有符合开闭原则的情况,也有不符合开闭原则的情况!!!

  • 缺点

    1. 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则
  • 适用场景

    1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。
    2. 系统中有多于一个的产品族,但每次只使用其中某一产品族。
    3. 属于同一个产品族的产品将在一起使用, 这一约束必须在系统的设计中体现出来。
    4. 产品等级结构稳定, 设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

三、名词解释

  1. 开放-关闭原则(开闭原则): 用抽象构建架构,用实现扩展细节。
    PS:讲人话就是不修改源代码。

  2. 产品等级结构: 产品等级结构即产品的继承结构

  3. 产品族: 产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品

下面用一张图描述到底什么是产品族,什么是产品等级结构。这种图叫做相图
横着的表示不同种类的产品,竖着的表示同一种类产品的不同类型。
例子:
一行表示一部手机的组成:CPU(处理器)、RAM(运行内存)、ROM(机身存储)
一列比如可以表示如下
CPU有:骁龙855、骁龙845、骁龙835
RAM有:4G、8G、16G
ROM有:64G、128G、256G
简单工厂模式,工厂方法模式,抽象工厂模式总结-java版_第1张图片
简单工厂模式,工厂方法模式以及抽象工厂模式的相图(博主自己理解画的)
简单工厂模式,工厂方法模式,抽象工厂模式总结-java版_第2张图片

四、简单工厂模式、工厂方法模式与抽象工厂模式之间的区别

  • 简单工厂模式与工厂方法模式区别:
  1. 简单工厂模式不符合开闭原则,工厂方法模式符合开闭原则。
  2. 两个模式中心不同。简单工厂模式的中心是一个实体工厂类,工厂方法模式的中心是抽象工厂类或接口。
  3. 简单工厂模式中,工厂类包含创建对象的逻辑判断(如:if…else或switch…case);工厂方法 模式中,不必包含创建对象的逻辑判断。
  • 工厂方法模式与抽象工厂模式区别:
  1. 工厂方法模式中一个实体工厂类只能创建一种实体产品类;抽象工厂模式中一个实体工厂类可以创建多种实体产品类。

    PS:讲人话就是,工厂方法模式:一个工厂一种产品抽象工厂模式:一个工厂多种产品

  2. 工厂方法模式只有一个抽象产品类,抽象工厂模式有多个抽象产品类。

五、抽象工厂模式的两种情况:①符合开闭原则;②不符合开闭原则

又称抽象工厂模式“开闭原则”的倾斜性

  • ①符合开闭原则情况

    增加产品族对于增加新的产品族抽象工厂模式很好地支持开闭原则,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改。

  • ②不符合开闭原则情况

    增加新的产品等级结构对于增加新的产品等级结构 ,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了开闭原则。

六、三种模式例子java实现代码

java实现简单工厂模式

java实现工厂模式与抽象工厂模式

七、个人简单总结

综上所述:

简单工厂模式:只有一个实体工厂类;一个实体工厂类生产所有的产品类,工厂根据传入的参数判断具体生产哪个产品给客户。

工厂方法模式:只有一个抽象产品类;一个实体工厂类生产一种产品类,客户需要知道生产该产品的工厂类名称。

抽象工厂模式:有多个抽象产品类;一个实体工厂类可以生产多种产品类,客户可以从一个工厂获得所有想要的产品。

持续更新中…

未经允许请勿转载,有问题请在评论区评论或者私信!

你可能感兴趣的:(设计模式)