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

工厂模式在C++中主要解决对象创建的解耦问题,核心是把“new具体类”的动作移到一个独立的工厂类或函数中,让调用方只依赖抽象接口,不关心具体类型如何构造。
简单工厂(非GoF标准,但实用)
用一个静态工厂函数根据参数返回不同子类对象,适合产品种类少、变化不频繁的场景。
关键点:返回智能指针避免内存泄漏;基类需有虚析构函数。
- 定义抽象产品基类(含纯虚接口和虚析构)
- 实现多个具体产品类(继承并重写接口)
- 编写工厂类/函数,内部用if-else或switch判断类型,new对应子类,返回std::unique_ptr或std::shared_ptr
示例片段:
立即学习“C++免费学习笔记(深入)”;
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
工厂方法模式(GoF标准)
定义一个创建对象的虚函数(工厂方法),由子类决定实例化哪个类。适用于产品族扩展频繁、需要支持多种产品系列的场景。
原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可
关键点:工厂基类声明纯虚工厂方法;每个具体工厂子类实现该方法,返回对应具体产品。
- 抽象工厂类(Creator)含纯虚createProduct(),返回抽象产品指针
- 具体工厂类(如WindowsFactory、MacFactory)重写createProduct(),返回各自平台的具体控件(Button、TextBox等)
- 客户端只依赖抽象工厂和抽象产品,运行时传入具体工厂实例
好处是新增产品系列只需加新工厂子类,不修改现有代码,符合开闭原则。
使用现代C++增强可维护性
避免裸new,统一用std::make_unique或std::make_shared;用enum class替代字符串参数提升类型安全;结合模板工厂减少重复代码(如template
若产品构造参数复杂,可配合Builder模式预配置对象再交由工厂组装。
注意常见陷阱
工厂类本身不应承担业务逻辑,只专注创建;避免工厂方法中出现多重条件嵌套,可考虑用映射表(std::map<:string creatorfunc>)替代硬编码分支;多线程环境下注意工厂函数的线程安全性,必要时加锁或使用线程局部存储。










