通八洲科技

c++如何实现工厂模式_c++创建型设计模式Factory Method【源码】

日期:2025-12-06 00:00 / 作者:裘德小鎮的故事
工厂模式在C++中通过封装对象创建过程,避免调用方直接new具体类;Factory Method模式定义创建接口,由子类决定实例化哪个类,包含抽象产品、具体产品、抽象工厂和具体工厂四部分。

工厂模式在 C++ 中核心是把对象的创建过程封装起来,让调用方不直接 new 具体类,而是通过统一接口获取对象。Factory Method(工厂方法)属于创建型模式,它定义一个创建对象的接口,但由子类决定实例化哪个类。

基本结构:抽象工厂 + 具体工厂 + 产品族

典型 Factory Method 模式包含四部分:

一个可运行的最小示例(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;

}

为什么用 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 的价值不在代码多炫,而在把“变”的创建逻辑隔离到子类,让核心业务代码只依赖抽象——改需求时,往往只动工厂子类,不动主流程。