工厂模式在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- Creator(抽象工厂):声明工厂方法
virtual Product* createProduct() = 0;,不实现具体创建逻辑;- ConcreteCreator(具体工厂):重写工厂方法,返回对应具体产品,如
class CircleFactory : public Creator { Product* createProduct() override { return new Circle; } }; - Creator(抽象工厂):声明工厂方法
一个可运行的最小示例(C++17)
下面代码无依赖、可直接编译运行,体现 Factory Method 的解耦本质:
#include#include #include // 抽象产品 struct Product { virtual ~Product() = default; virtual std::string name() const = 0; };
// 具体产品 A struct ConcreteProductA : Product { std::string name() const override { return "ProductA"; } };
// 具体产品 B struct ConcreteProductB : Product { std::string name() const override { return "ProductB"; } };
// 抽象工厂(Creator) struct Creator { // 工厂方法:由子类决定返回哪种产品 virtual std::unique_ptr
create() = 0; virtual ~Creator() = default; }; // 具体工厂 A struct CreatorA : Creator { std::unique_ptr
create() override { return std::make_unique (); } }; // 具体工厂 B struct CreatorB : Creator { std::unique_ptr
create() override { return std::make_unique (); } }; // 使用示例 int main() { CreatorA factoryA; auto p1 = factoryA.create(); std::cout << p1->name() << '\n'; // 输出:ProductA
CreatorB factoryB; auto p2 = factoryB.create(); std::cout zuojiankuohaophpcnzuojiankuohaophpcn p2-youjiankuohaophpcnname() zuojiankuohaophpcnzuojiankuohaophpcn '\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 的价值不在代码多炫,而在把“变”的创建逻辑隔离到子类,让核心业务代码只依赖抽象——改需求时,往往只动工厂子类,不动主流程。











