文章

抽象工厂模式

抽象工厂模式

本文介绍抽象工厂模式定义、结构、特点、适用场景、代码实现。

抽象工厂模式

1 模式的定义

抽象工厂模式(克隆)是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。

2 模式的结构

2.1 结构图

2.2 参与者

  1. 抽象产品(Abstract Product)为构成系列产品的一组不同但相关的产品声明接口。
  2. 具体产品(Concrete Product)是抽象产品的多种不同类型实现。所有变体(维多利亚/现代)都必须实现相应的抽象产品(椅子/沙发)。
  3. 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象产品的方法。
  4. 具体工厂(Concrete Factory)实现抽象工厂的构建方法。每个具体工厂都对应特定产品变体,且仅创建此种产品变体。

3 模式分析

3.1 优点

  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。你可以将产品生成代码抽取到同一位置,使得代码易于维护。
  • 开闭原则。向应用程序中引入新产品变体时,你无需修改客户端代码。

3.2 缺点

由于采用该模式需要向应用中引入众多接口和类,代码可能会比之前更加复杂。

4 适用环境

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

5 实现方式

  1. 以不同的产品类型与产品变体为维度绘制矩阵。
  2. 为所有产品声明抽象产品接口。然后让所有具体产品类实现这些接口。
  3. 声明抽象工厂接口,并且在接口中为所有抽象产品提供一组构建方法。
  4. 为每种产品变体实现一个具体工厂类。
  5. 在应用程序中开发初始化代码。该代码根据应用程序配置或当前环境,对特定具体工厂类进行初始化。然后将该工厂对象传递给所有需要创建产品的类。
  6. 找出代码中所有对产品构造函数的直接调用,将其替换为对工厂对象中相应构建方法的调用。

6 代码实现

https://github.com/august295/DesignPatternCode

参考

[1] https://refactoringguru.cn/design-patterns/abstract-factory

[2] https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

本文由作者按照 CC BY 4.0 进行授权