工厂模式在C++中通过封装对象创建过程,避免调用方直接new具体类;Factory Method模式定义创建接口,由子类决定实例化哪个类,包含抽象产品、具体产品、抽象工厂和具体工厂四部分。

工厂模式在 C++ 中核心是把对象的创建过程封装起来,让调用方不直接 new 具体类,而是通过统一接口获取对象。Factory Method(工厂方法)属于创建型模式,它定义一个创建对象的接口,但由子类决定实例化哪个类。
基本结构:抽象工厂 + 具体工厂 + 产品族
典型 Factory Method 模式包含四部分:
-
Product(抽象产品):定义产品接口,比如
class Shape { public: virtual void draw() = 0; }; -
ConcreteProduct(具体产品):如
class Circle : public Shape { void draw() override { cout <li> <strong>Creator(抽象工厂)</strong>:声明工厂方法 <code>virtual Product* createProduct() = 0;,不实现具体创建逻辑; -
ConcreteCreator(具体工厂):重写工厂方法,返回对应具体产品,如
class CircleFactory : public Creator { Product* createProduct() override { return new Circle; } };</li></ul><H3>一个可运行的最小示例(C++17)</H3><p>下面代码无依赖、可直接编译运行,体现 Factory Method 的解耦本质:</p><font color="#888"><pre class="brush:php;toolbar:false;"> #include <iostream> #include <memory> #include <string> <p>// 抽象产品 struct Product { virtual ~Product() = default; virtual std::string name() const = 0; };</p><p>// 具体产品 A struct ConcreteProductA : Product { std::string name() const override { return "ProductA"; } };</p><p>// 具体产品 B struct ConcreteProductB : Product { std::string name() const override { return "ProductB"; } };</p><p>// 抽象工厂(Creator) struct Creator { // 工厂方法:由子类决定返回哪种产品 virtual std::unique_ptr<Product> create() = 0; virtual ~Creator() = default; };</p><p>// 具体工厂 A struct CreatorA : Creator { std::unique_ptr<Product> create() override { return std::make_unique<ConcreteProductA>(); } };</p><p>// 具体工厂 B struct CreatorB : Creator { std::unique_ptr<Product> create() override { return std::make_unique<ConcreteProductB>(); } };</p><p>// 使用示例 int main() { CreatorA factoryA; auto p1 = factoryA.create(); std::cout << p1->name() << '\n'; // 输出:ProductA</p><pre class='brush:php;toolbar:false;'>CreatorB factoryB; auto p2 = factoryB.create(); std::cout << p2->name() << '\n'; // 输出:ProductB return 0;}
立即学习“C++免费学习笔记(深入)”;
为什么用 unique_ptr 而不是 raw pointer?
现代 C++ 推荐用智能指针管理工厂返回的对象生命周期:
- 避免手动
delete 导致内存泄漏或重复释放; -
std::unique_ptr明确所有权,语义清晰; - 若需共享所有权,可用
std::shared_ptr,但要评估是否真需要共享; - 工厂方法返回值类型统一为智能指针,调用方无需关心析构细节。
和简单工厂、抽象工厂的区别要点
别混淆这几个“工厂”:
-
简单工厂:不是 GoF 模式,只是一个普通工具类(如
ShapeFactory::create("circle")),违反开闭原则; - Factory Method:用继承扩展创建逻辑,新增产品只需加新工厂子类,符合开闭原则;
- 抽象工厂(Abstract Factory):创建“产品族”,比如同时创建 Button + TextBox(Win 系列 / Mac 系列),比 Factory Method 更高层。
基本上就这些。Factory Method 的价值不在代码多炫,而在把“变”的创建逻辑隔离到子类,让核心业务代码只依赖抽象——改需求时,往往只动工厂子类,不动主流程。
- 避免手动











