C++ 工厂模式复习

1 阅读2分钟

1. 工厂模式主要是什么

工厂模式是一种创建型设计模式

它的核心就是:

把对象的创建过程封装起来,不让调用方直接 new 具体类对象。

本质作用:解耦对象的使用和对象的创建


2. 工厂模式有哪几种

(1)简单工厂

一个工厂类,根据参数创建不同对象。

体现:

auto p = Factory::Create("dog");

特点:

  • 简单直接
  • 常用 if-else / switch
  • 新增类型通常要改工厂代码

(2)工厂方法

不是一个总工厂,而是每个产品有自己的工厂

体现:

  • DogFactory 专门创建 Dog
  • CatFactory 专门创建 Cat

特点:

  • 更符合开闭原则
  • 扩展性比简单工厂好
  • 类会变多

(3)抽象工厂

用于创建一整套相关对象,不是单个对象。

体现:
比如跨平台 UI:

  • WindowsButton + WindowsTextBox
  • MacButton + MacTextBox

特点:

  • 强调“产品族”
  • 适合一组配套对象一起创建

3. 大概怎么体现

工厂模式一般会有这几个角色:

抽象产品

统一接口,比如:

class Animal {
public:
    virtual void Speak() = 0;
    virtual ~Animal() = default;
};

具体产品

不同实现,比如:

  • Dog
  • Cat

工厂

负责创建对象,比如:

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. 一句话总结

工厂模式就是把“创建对象”这件事单独封装起来,让外部通过工厂拿对象,而不是直接依赖具体类。