1. 工厂模式主要是什么
工厂模式是一种创建型设计模式。
它的核心就是:
把对象的创建过程封装起来,不让调用方直接
new具体类对象。
本质作用:解耦对象的使用和对象的创建。
2. 工厂模式有哪几种
(1)简单工厂
一个工厂类,根据参数创建不同对象。
体现:
auto p = Factory::Create("dog");
特点:
- 简单直接
- 常用
if-else/switch - 新增类型通常要改工厂代码
(2)工厂方法
不是一个总工厂,而是每个产品有自己的工厂。
体现:
DogFactory专门创建DogCatFactory专门创建Cat
特点:
- 更符合开闭原则
- 扩展性比简单工厂好
- 类会变多
(3)抽象工厂
用于创建一整套相关对象,不是单个对象。
体现:
比如跨平台 UI:
- WindowsButton + WindowsTextBox
- MacButton + MacTextBox
特点:
- 强调“产品族”
- 适合一组配套对象一起创建
3. 大概怎么体现
工厂模式一般会有这几个角色:
抽象产品
统一接口,比如:
class Animal {
public:
virtual void Speak() = 0;
virtual ~Animal() = default;
};
具体产品
不同实现,比如:
DogCat
工厂
负责创建对象,比如:
class AnimalFactory {
public:
static std::unique_ptr<Animal> Create(const std::string& type);
};
也就是说:
- 外部代码不直接
new Dog - 而是通过工厂拿到
Animal
4. 应用场景
工厂模式适合:
(1)同一接口有多种实现
比如:
- 日志:控制台日志 / 文件日志
- 数据库:MySQL / SQLite / PostgreSQL
- 解码器:H264 / HEVC / AV1
(2)根据配置或条件创建对象
比如:
- 读取配置文件决定创建哪种对象
- 根据用户选择返回不同实现
(3)对象创建过程复杂
比如创建对象前要做:
- 参数检查
- 初始化资源
- 日志记录
- 异常处理
(4)游戏开发
比如:
- 创建不同敌人
- 创建不同武器
- 创建不同技能特效
(5)跨平台开发
比如:
- Windows 窗口
- Linux 窗口
- Mac 窗口
5. 优点
(1)解耦
调用方不依赖具体类。
(2)统一管理创建逻辑
对象怎么创建都放到工厂里处理。
(3)便于扩展
后续新增产品类型更方便。
(4)更符合面向抽象编程
外部通常依赖基类/接口,而不是具体实现。
6. 缺点
(1)代码结构会更复杂
会多出工厂类、抽象类。
(2)类会变多
特别是工厂方法、抽象工厂。
(3)简单场景下可能过度设计
如果对象创建非常简单,直接 new 可能更直接。
(4)简单工厂不够灵活
新增产品通常还要改原来的工厂代码。
7. 一句话总结
工厂模式就是把“创建对象”这件事单独封装起来,让外部通过工厂拿对象,而不是直接依赖具体类。