抽象工厂模式
抽象工厂模式
本文介绍抽象工厂模式定义、结构、特点、适用场景、代码实现。
抽象工厂模式
1 模式的定义
抽象工厂模式(克隆)是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。
2 模式的结构
2.1 结构图
2.2 参与者
- 抽象产品(Abstract Product)为构成系列产品的一组不同但相关的产品声明接口。
- 具体产品(Concrete Product)是抽象产品的多种不同类型实现。所有变体(维多利亚/现代)都必须实现相应的抽象产品(椅子/沙发)。
- 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象产品的方法。
- 具体工厂(Concrete Factory)实现抽象工厂的构建方法。每个具体工厂都对应特定产品变体,且仅创建此种产品变体。
3 模式分析
3.1 优点
- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。你可以将产品生成代码抽取到同一位置,使得代码易于维护。
- 开闭原则。向应用程序中引入新产品变体时,你无需修改客户端代码。
3.2 缺点
由于采用该模式需要向应用中引入众多接口和类,代码可能会比之前更加复杂。
4 适用环境
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
- 系统中有多于一个的产品族,而每次只使用其中某一产品族。
- 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
5 实现方式
- 以不同的产品类型与产品变体为维度绘制矩阵。
- 为所有产品声明抽象产品接口。然后让所有具体产品类实现这些接口。
- 声明抽象工厂接口,并且在接口中为所有抽象产品提供一组构建方法。
- 为每种产品变体实现一个具体工厂类。
- 在应用程序中开发初始化代码。该代码根据应用程序配置或当前环境,对特定具体工厂类进行初始化。然后将该工厂对象传递给所有需要创建产品的类。
- 找出代码中所有对产品构造函数的直接调用,将其替换为对工厂对象中相应构建方法的调用。
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 进行授权