c++如何实现工厂模式 c++设计模式之工厂方法【实例】

工厂模式通过将“new具体类”移至独立工厂中实现创建解耦,调用方仅依赖抽象接口;简单工厂用静态函数按参数返回智能指针封装的子类对象,要求基类有虚析构函数。

工厂模式在C++中主要解决对象创建的解耦问题,核心是把“new具体类”的动作移到一个独立的工厂类或函数中,让调用方只依赖抽象接口,不关心具体类型如何构造。

简单工厂(非GoF标准,但实用)

用一个静态工厂函数根据参数返回不同子类对象,适合产品种类少、变化不频繁的场景。

关键点:返回智能指针避免内存泄漏;基类需有虚析构函数。

  • 定义抽象产品基类(含纯虚接口和虚析构)
  • 实现多个具体产品类(继承并重写接口)
  • 编写工厂类/函数,内部用if-else或switch判断类型,new对应子类,返回std::unique_ptr或std::shared_ptr

示例片段:

class Shape { public: virtual ~Shape() = default; virtual void draw() const = 0; };
class Circle : public Shape { void draw() const override { std::cout
class Rectangle : public Shape { void draw() const override { std::cout
std::unique_ptr createShape(const std::string& type) { if (type == "circle") return std::make_unique(); else if (type == "rectangle") return std::make_unique(); return nullptr; }

工厂方法模式(GoF标准)

定义一个创建对象的虚函数(工厂方法),由子类决定实例化哪个类。适用于产品族扩展频繁、需要支持多种产品系列的场景。

关键点:工厂基类声明纯虚工厂方法;每个具体工厂子类实现该方法,返回对应具体产品。

  • 抽象工厂类(Creator)含纯虚createProduct(),返回抽象产品指针
  • 具体工厂类(如WindowsFactory、MacFactory)重写createProduct(),返回各自平台的具体控件(Button、TextBox等)
  • 客户端只依赖抽象工厂和抽象产品,运行时传入具体工厂实例

好处是新增产品系列只需加新工厂子类,不修改现有代码,符合开闭原则。

使用现代C++增强可维护性

避免裸new,统一用std::make_unique或std::make_shared;用enum class替代字符串参数提升类型安全;结合模板工厂减少重复代码(如template std::unique_ptr create() { return std::make_unique(); })。

若产品构造参数复杂,可配合Builder模式预配置对象再交由工厂组装。

注意常见陷阱

工厂类本身不应承担业务逻辑,只专注创建;避免工厂方法中出现多重条件嵌套,可考虑用映射表(std::map<:string creatorfunc>)替代硬编码分支;多线程环境*意工厂函数的线程安全性,必要时加锁或使用线程局部存储。