🎨设计模式:三种工厂模式
00 分钟
2023-7-7
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛
设计模式项目地址:C++ Java python实现

简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式可以减少客户程序对类创建过程的依赖。

简单工厂实现步骤

  • 提供一个工厂类
    • 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑工厂类可以被外界直接调用,创建所需的产品对象。
  • 提供一个抽象产品类
    • 是一个抽象类,它负责描述所有实例所共有的公共接口
  • 提供一个具体产品类
    • 简单工厂模式所创建的具体实例对象
notion image

实现代码: 我们实现一个造飞机和火箭的系统。
  1. 抽象产品类声明飞机产品和火箭产品的业务方法(纯虚函数,等待子类实现)。
  1. 具体产品类实现其父类的业务方法
  1. 具体工厂类创建产品对象:创建造飞机厂和造火箭厂

简单工厂优缺点

优点
  • 帮助封装
    • 实现组件封装,面向接口编程
  • 解耦合
    • 客户端和具体实现类的解耦合
缺点
  • 可能增加客户端的复杂度
  • 不方便扩展子工厂

工厂模式

工厂方法模式同样属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义是 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色仅负责具体工厂子类 必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品

工厂模式和简单工厂模式有什么不同?

工厂方法模式与简单工厂模式的区别在结构上的并不明显。
  1. 而简单工厂模式把核心放在一个具体工厂类上。
  1. 工厂方法类的核心是一个抽象工厂类
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口, 或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了《“开放-封闭”原则 》 。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
在添加新产品对象时的不同:
  1. 简单工厂模式需要修改工厂方法,不符合《开放封闭原则》
  1. 工厂模式无需修改抽象工厂方法,只需添加一个具体工厂,符合《开放封闭原则》

工厂模式实现步骤

1.提供一个抽象工厂类 :所有具体工厂类的父类
2.提供与产品对应的实例工厂类:负责实例化产品对象
3.提供一个抽象产品类: 所有产品的父类
4.提供一个或多个实例产品类:工厂方法模式所创建的具体实例对象
notion image

实现代码

依旧是造飞机和火箭的例子,我们来看看它与简单工厂模式有什么不同?
  1. 抽象产品类:飞机产品与火箭产品所具有的业务方法
  1. 抽象工厂类:这是相比简单工厂模式不同的地方,把各个产品的工厂分隔开,实现一个抽象工厂,其声明了各个工厂创建对象的方法。
  1. 具体产品类
  1. 具体工厂类

工厂模式优缺点

优点
  • 需求改变时改动最小
  • 具体的创建实例过程与客户端分离
缺点:
  • 新增功能时,工程量稍大

抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
抽象工厂方法是针对与一个产品族,使得易于交换产品系列,只需改变具体的工厂就可以使用不同的产品配置。当一个族中的产品对象被设计成一起工作且一个应用只适用同一族的对象,例如设计系统生成不同风格的UI界面,按钮,边框等UI元素在一起使用,并且只能同属于一种风格,这很容易使用抽象工厂实现。

抽象工厂模式实现步骤

  1. 提供一个抽象工厂类:声明一组创建一族产品的工厂方法
  1. 提供一个具体工厂类:实现了在抽象工厂创建产品的工厂方法
  1. 提供一个抽象产品类:抽象产品中声明了产品具有的业务方法
  1. (可选)提供抽象产品族:抽象产品族表示了某些不同族的产品类型(键盘,鼠标..)
  1. 提供一个具体产品类:实现抽象产品接口中声明的业务方法
notion image

实现代码

抽象工厂模式优缺点

优点
  • 抽象工厂封装了变化,封装了对象创建的具体细节
  • 增加新的产品族很方便,无须修改已有系统
  • 针对接口进行编程而不是针对具体进行编程
缺点:
  • 增加新的产品等级结构需对原系统做较大修改(违背开放封闭)
 

评论
  • Twikoo
  • Valine