抽象工厂模式
最后更新于:2022-04-02 04:18:59
[TOC]
## 概述
1. 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
2. 抽象工厂模式通常基于一组工厂方法
如以下情况就需要抽象模式
![](https://cdn.jsdelivr.net/gh/idcpj/imgs/1599962289200-1599962289193.png)
## 场景
1. 一系列相关产品,例如`椅子`Chair、`沙发`Sofa和`咖啡桌`CoffeeTable。
2. 系列产品的不同变体。例如,你可以使用`现代`Modern、`维多利亚`Victorian、`装饰风艺术`ArtDeco等风格生成`椅子`、`沙发`和`咖啡桌`。
## 抽象工厂模式适合应用场景
- 如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
- 如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。
## 抽象工厂模式结构
**1.抽象产品 (Abstract Product)** 为构成系列产品的一组不同但相关的产品声明接口。
**2. 具体产品 (Concrete Product)** 是抽象产品的多种不同类型实现。 所有变体 (维多利亚/现代) 都必须实现相应的抽象产品 (椅子/沙发)。
**3. 抽象工厂(Abstract Factory)** 接口声明了一组创建各种抽象产品的方法。
**4. 具体工厂 (Concrete Factory)** 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体, 且仅创建此种产品变体。
5. 尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的*抽象*产品。这样,使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。**客户端**(Client)只需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/产品变体交互。
## 抽象工厂模式优缺点
**优点**
1. 你可以确保同一工厂生成的产品相互匹配。
2. 你可以避免客户端和具体产品代码的耦合。
3. 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
4. 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。
**缺点**
1. 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
## 与其他模式的关系
* 在许多设计工作的初期都会使用[工厂方法模式](https://refactoringguru.cn/design-patterns/factory-method)(较为简单,而且可以更方便地通过子类进行定制),随后演化为使用[抽象工厂模式](https://refactoringguru.cn/design-patterns/abstract-factory)、[原型模式](https://refactoringguru.cn/design-patterns/prototype)或[生成器模式](https://refactoringguru.cn/design-patterns/builder)(更灵活但更加复杂)。
* [生成器](https://refactoringguru.cn/design-patterns/builder)重点关注如何分步生成复杂对象。[抽象工厂](https://refactoringguru.cn/design-patterns/abstract-factory)专门用于生产一系列相关对象。*抽象工厂*会马上返回产品,*生成器*则允许你在获取产品前执行一些额外构造步骤。
* [抽象工厂模式](https://refactoringguru.cn/design-patterns/abstract-factory)通常基于一组[工厂方法](https://refactoringguru.cn/design-patterns/factory-method),但你也可以使用[原型模式](https://refactoringguru.cn/design-patterns/prototype)来生成这些类的方法。
* 当只需对客户端代码隐藏子系统创建对象的方式时,你可以使用[抽象工厂](https://refactoringguru.cn/design-patterns/abstract-factory)来代替[外观模式](https://refactoringguru.cn/design-patterns/facade)。
* 你可以将[抽象工厂](https://refactoringguru.cn/design-patterns/abstract-factory)和[桥接模式](https://refactoringguru.cn/design-patterns/bridge)搭配使用。如果由*桥接*定义的抽象只能与特定实现合作,这一模式搭配就非常有用。在这种情况下,*抽象工厂*可以对这些关系进行封装,并且对客户端代码隐藏其复杂性。
* [抽象工厂](https://refactoringguru.cn/design-patterns/abstract-factory)、[生成器](https://refactoringguru.cn/design-patterns/builder)和[原型](https://refactoringguru.cn/design-patterns/prototype)都可以用[单例模式](https://refactoringguru.cn/design-patterns/singleton)来实现。
';