一、简单工厂模式(Simple Factory)
1. 核心思想
一个工厂类,根据传入的参数,决定创建哪一种具体产品对象。 所有产品共用同一个工厂,结构最简单,也叫静态工厂模式。
2. 模式结构
- 抽象产品(Product):定义产品的公共接口
- 具体产品(ConcreteProduct):实现抽象产品的具体类
- 工厂类(Factory):提供静态方法,根据参数创建不同产品
3. C++ 代码实现
以 ** 创建不同形状(圆形、方形)** 为例:
#include <iostream>
using namespace std;
// ===================== 1. 抽象产品:定义公共接口 =====================
class Shape {
public:
virtual void draw() = 0; // 纯虚函数,抽象方法
virtual ~Shape() = default;
};
// ===================== 2. 具体产品:圆形 =====================
class Circle : public Shape {
public:
void draw() override {
cout << "绘制圆形 ✅" << endl;
}
};
// ===================== 具体产品:方形 =====================
class Rectangle : public Shape {
public:
void draw() override {
cout << "绘制方形 ✅" << endl;
}
};
// ===================== 3. 简单工厂类:核心创建逻辑 =====================
class ShapeFactory {
public:
// 静态方法:根据类型创建对应形状对象
static Shape* createShape(const string& type) {
if (type == "circle") {
return new Circle();
} else if (type == "rectangle") {
return new Rectangle();
}
return nullptr; // 无匹配类型
}
};
// ===================== 客户端使用 =====================
int main() {
// 客户端只调用工厂,不直接new Circle/Rectangle
Shape* shape1 = ShapeFactory::createShape("circle");
Shape* shape2 = ShapeFactory::createShape("rectangle");
shape1->draw();
shape2->draw();
// 释放内存
delete shape1;
delete shape2;
return 0;
}
4. 优缺点
表格
| 优点 | 缺点 |
|---|---|
| 代码简单,使用方便 | 严重违背开闭原则:新增产品必须修改工厂类 |
| 客户端与具体产品解耦 | 产品过多时,工厂类代码臃肿 |
| 统一管理对象创建 | 无法形成继承结构,扩展受限 |
5. 应用场景
- 产品类型数量少、几乎不扩展
- 客户端只需要简单获取对象,不关心创建逻辑
- 小工具、简单业务模块(如日志对象、配置对象创建)
二、工厂方法模式(Factory Method)
1. 核心思想
一个产品对应一个工厂,不再共用一个工厂。
- 抽象工厂定义创建接口
- 每个具体产品对应一个具体工厂
- 新增产品时,只新增工厂类,不修改原有代码 → 完全符合开闭原则
2. 模式结构
- 抽象产品
- 具体产品
- 抽象工厂:定义创建产品的接口
- 具体工厂:每个工厂只创建一种产品
3. C++ 代码实现
延续形状案例,改造为工厂方法:
#include <iostream>
using namespace std;
// ===================== 1. 抽象产品 =====================
class Shape {
public:
virtual void draw() = 0;
virtual ~Shape() = default;
};
// ===================== 2. 具体产品 =====================
class Circle : public Shape {
public:
void draw() override { cout << "绘制圆形" << endl; }
};
class Rectangle : public Shape {
public:
void draw() override { cout << "绘制方形" << endl; }
};
// ===================== 3. 抽象工厂:定义创建接口 =====================
class ShapeFactory {
public:
virtual Shape* createShape() = 0;
virtual ~ShapeFactory() = default;
};
// ===================== 4. 具体工厂:圆形工厂 =====================
class CircleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Circle();
}
};
// ===================== 具体工厂:方形工厂 =====================
class RectangleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Rectangle();
}
};
// ===================== 客户端使用 =====================
int main() {
// 创建圆形工厂 → 生产圆形
ShapeFactory* factory1 = new CircleFactory();
Shape* circle = factory1->createShape();
circle->draw();
// 创建方形工厂 → 生产方形
ShapeFactory* factory2 = new RectangleFactory();
Shape* rect = factory2->createShape();
rect->draw();
// 释放内存
delete circle;
delete factory1;
delete rect;
delete factory2;
return 0;
}
4. 优缺点
表格
| 优点 | 缺点 |
|---|---|
| 完全符合开闭原则,新增产品只加类,不改旧代码 | 类数量爆炸:每加一个产品,就要加一个工厂类 |
| 单一职责:一个工厂只造一种产品 | 结构比简单工厂复杂,理解成本稍高 |
| 解耦更彻底,便于单元测试 | 客户端需要知道不同工厂的存在 |
5. 应用场景
- 产品类型需要频繁扩展
- 单一产品等级结构(只有一类产品)
- 框架设计、中间件、SDK 底层(如 Spring Bean 工厂)
三、抽象工厂模式(Abstract Factory)
1. 核心思想
工厂生产「产品族」,而不是单个产品。
- 产品族:一组相关 / 相互依赖的产品(如华为工厂生产:华为手机 + 华为电脑)
- 一个抽象工厂可以创建多个不同类型的产品
2. 模式结构
- 抽象产品族:多个抽象产品(Phone、Computer)
- 具体产品族:华为手机、华为电脑;苹果手机、苹果电脑
- 抽象工厂:定义创建所有产品的接口
- 具体工厂:华为工厂、苹果工厂
3. C++ 代码实现
以电子设备产品族为例:
#include <iostream>
using namespace std;
// ===================== 1. 抽象产品A:手机 =====================
class Phone {
public:
virtual void showBrand() = 0;
virtual ~Phone() = default;
};
// ===================== 抽象产品B:电脑 =====================
class Computer {
public:
virtual void showBrand() = 0;
virtual ~Computer() = default;
};
// ===================== 2. 具体产品族:华为 =====================
class HuaweiPhone : public Phone {
public:
void showBrand() override { cout << "华为手机" << endl; }
};
class HuaweiComputer : public Computer {
public:
void showBrand() override { cout << "华为电脑" << endl; }
};
// ===================== 具体产品族:苹果 =====================
class ApplePhone : public Phone {
public:
void showBrand() override { cout << "苹果手机" << endl; }
};
class AppleComputer : public Computer {
public:
void showBrand() override { cout << "苹果电脑" << endl; }
};
// ===================== 3. 抽象工厂:能生产手机+电脑 =====================
class ElectronicFactory {
public:
virtual Phone* createPhone() = 0;
virtual Computer* createComputer() = 0;
virtual ~ElectronicFactory() = default;
};
// ===================== 4. 具体工厂:华为工厂 =====================
class HuaweiFactory : public ElectronicFactory {
public:
Phone* createPhone() override { return new HuaweiPhone(); }
Computer* createComputer() override { return new HuaweiComputer(); }
};
// ===================== 具体工厂:苹果工厂 =====================
class AppleFactory : public ElectronicFactory {
public:
Phone* createPhone() override { return new ApplePhone(); }
Computer* createComputer() override { return new AppleComputer(); }
};
// ===================== 客户端使用 =====================
int main() {
// 华为工厂生产华为全家桶
ElectronicFactory* factory = new HuaweiFactory();
Phone* phone = factory->createPhone();
Computer* computer = factory->createComputer();
phone->showBrand();
computer->showBrand();
// 切换为苹果工厂
factory = new AppleFactory();
phone = factory->createPhone();
computer = factory->createComputer();
phone->showBrand();
computer->showBrand();
return 0;
}
4. 优缺点
表格
| 优点 | 缺点 |
|---|---|
| 保证产品族的一致性(华为工厂只造华为产品) | 扩展新产品极难:要修改所有工厂类 |
| 符合开闭原则(新增产品族只加类) | 结构最复杂,理解成本最高 |
| 强约束,避免产品不匹配 | 只适用于多产品族的固定结构 |
5. 应用场景
- 存在多个产品系列 / 产品族
- 产品之间有依赖、约束关系
- 系统需要切换不同的产品组合(如换肤、多数据库兼容)
- 经典案例:UI 组件库(浅色 / 深色主题)、数据库驱动工厂
四、三代工厂模式核心对比(必记)
表格
| 模式 | 核心特点 | 开闭原则 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| 简单工厂 | 一个工厂造所有产品 | ❌ 违背 | 低 | 产品少、不扩展 |
| 工厂方法 | 一个工厂造一种产品 | ✅ 遵守 | 中 | 单类产品、常扩展 |
| 抽象工厂 | 一个工厂造一族产品 | ✅ 遵守 | 高 | 多产品族、固定结构 |
五、工厂模式终极总结
- 本质 :封装
new过程,解耦创建与使用 - 简单工厂:入门版,适合小场景,违反开闭
- 工厂方法:标准版,最常用,完美遵循开闭
- 抽象工厂:高级版,适合多产品族,约束性强
- 所有工厂模式的共同优点 :
- 降低代码耦合
- 统一对象创建逻辑
- 便于维护和扩展
- 隐藏对象初始化细节