抽象工厂模式(Abstract Factory Pattern)
一、核心定义
抽象工厂模式 可以理解为:生产一系列相关产品的工厂的抽象。
本质:把"创建一组相关对象"的操作统一封装起来。
二、与其他工厂模式的对比
| 模式 | 核心思想 |
|---|---|
| 简单工厂 | 一个工厂生产所有产品 |
| 工厂方法 | 一个产品对应一个工厂 |
| 抽象工厂 | 一个工厂生产一整套产品族 |
重点:抽象工厂不是生产一个产品,而是生产一套配套产品。
示例:
- 电脑 = CPU + 主板 + 内存
- 必须是同一系列兼容的:
- Intel 套装:Intel CPU + Intel 主板
- AMD 套装:AMD CPU + AMD 主板
- 抽象工厂:
- Intel工厂 → 生产 Intel CPU + Intel 主板
- AMD工厂 → 生产 AMD CPU + AMD 主板
三、结构图
抽象工厂
↓
具体工厂A 具体工厂B
↓ ↓
产品A1 A2 产品B1 B2
示例结构:
AbstractFactory
createCPU()
createMainBoard()
IntelFactory
createCPU()
createMainBoard()
AMDFactory
createCPU()
createMainBoard()
四、C++ 实现示例
1. 产品接口
cpp
class CPU {
public:
virtual void compute() = 0;
};
class MainBoard {
public:
virtual void install() = 0;
};
2. Intel产品
cpp
class IntelCPU : public CPU {
public:
void compute() override {}
};
class IntelMainBoard : public MainBoard {
public:
void install() override {}
};
3. AMD产品
cpp
class AMDCPU : public CPU {
public:
void compute() override {}
};
class AMDMainBoard : public MainBoard {
public:
void install() override {}
};
4. 抽象工厂
cpp
class AbstractFactory {
public:
virtual CPU* createCPU() = 0;
virtual MainBoard* createMainBoard() = 0;
};
5. 具体工厂
cpp
class IntelFactory : public AbstractFactory {
public:
CPU* createCPU() override {
return new IntelCPU();
}
MainBoard* createMainBoard() override {
return new IntelMainBoard();
}
};
class AMDFactory : public AbstractFactory {
public:
CPU* createCPU() override {
return new AMDCPU();
}
MainBoard* createMainBoard() override {
return new AMDMainBoard();
}
};
6. 使用
cpp
AbstractFactory* factory = new IntelFactory();
CPU* cpu = factory->createCPU();
MainBoard* board = factory->createMainBoard();
客户端只依赖工厂接口,不依赖具体产品,这是抽象工厂模式的最大价值。
五、本质理解
三种工厂模式本质对比
| 模式 | 本质 |
|---|---|
| 简单工厂 | 封装 new |
| 工厂方法 | 延迟 new 到子类 |
| 抽象工厂 | 封装一组有关联的 new |
核心问题解决
抽象工厂解决的是:对象族的一致性问题
- 不能:Intel CPU + AMD 主板
- 必须:Intel CPU + Intel 主板
本质:保证对象组合的正确性。
六、使用场景(工程视角)
当系统存在多个产品族时,适合使用抽象工厂模式。
示例:
- 仿真框架中的不同体系:
- 美军体系:雷达 + 导弹 + 通信
- 北约体系:雷达 + 导弹 + 通信
- 可以设计:
- USFactory
- NATOFactory
- 一次创建一整套系统
这也是很多大型仿真框架的常见设计。
七、终极理解
关键区别
text
简单工厂:
一个工厂生产所有产品
工厂方法:
一个工厂生产一个产品
抽象工厂:
一个工厂生产一套产品
工程视角
抽象工厂 = 产品族工厂
进阶理解
抽象工厂可以看作是工厂方法的升级版,因为它不仅解决了单个产品的创建问题,还解决了相关产品族的一致性问题,确保了对象组合的正确性。