一、简单工厂 简单工厂模式的核心是通过一个工厂类统一创建不同产品实例 ,本质是将对象创建逻辑与使用逻辑分离。C++ 作为面向对象编程语言,天然支持类与继承 、多态 、虚函数 等特性,相比 C 语言的模拟实现,能更直接、优雅地满足简单工厂模式的设计意图,且无需手动管理函数指针与内存分配的绑定关系。
从两个维度理解适配性:
语法维度 :通过抽象基类定义产品接口,具体产品类继承基类并实现纯虚函数,工厂类通过静态成员函数创建产品实例,完全符合面向对象的设计规范
功能维度 :利用 C++ 的多态特性,调用者可通过基类指针 / 引用统一操作不同产品,无需关注具体产品类型;通过构造函数与析构函数自动管理内存,避免内存泄漏风险
二、核心结构 2.1 核心角色定义(面向对象原生支持)
角色名称
实现方式
核心职责
抽象产品(Product)
抽象基类(含纯虚函数)
定义所有产品的统一接口,规范产品行为
具体产品(ConcreteProduct)
继承抽象基类的子类
实现抽象产品的纯虚函数,提供具体产品的业务逻辑
工厂(Factory)
包含静态成员函数的类
根据输入参数(如类型枚举、字符串),创建并返回对应具体产品的实例
2.2 关键技术点说明 抽象基类与纯虚函数 :virtual double calculate(double a, double b) = 0; 定义产品必须实现的接口,强制具体产品类遵循统一规范
静态工厂方法 :工厂类无需实例化,通过static Calculator* createCalculator(CalculatorType type)直接调用,简化调用流程
多态与动态绑定 :调用者通过抽象基类指针调用calculate方法时,C++ 会自动根据对象实际类型调用对应子类的实现,体现多态特性
自动内存管理 :通过delete关键字释放产品实例,结合虚析构函数确保子类资源被完整释放
三、完整代码实现 3.1 抽象产品与具体产品定义(Calculator.h) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 #ifndef CALCULATOR_H #define CALCULATOR_H // 产品类型枚举(工厂的输入参数) enum class CalculatorType { ADD, // 加法器 SUB, // 减法器 MUL, // 乘法器 DIV // 除法器 }; // 抽象产品:计算器基类 class Calculator { public: // 虚析构函数:确保delete基类指针时,子类析构函数被调用 virtual ~Calculator() = default; // 纯虚函数:定义计算器的核心接口(强制子类实现) virtual double calculate(double a, double b) = 0; // 获取产品名称(可被子类重写) virtual const char* getName() const = 0; }; // 具体产品1:加法器 class AddCalculator : public Calculator { public: double calculate(double a, double b) override { return a + b; } const char* getName() const override { return "加法器"; } }; // 具体产品2:减法器 class SubCalculator : public Calculator { public: double calculate(double a, double b) override { return a - b; } const char* getName() const override { return "减法器"; } }; // 具体产品3:乘法器 class MulCalculator : public Calculator { public: double calculate(double a, double b) override { return a * b; } const char* getName() const override { return "乘法器"; } }; // 具体产品4:除法器(含异常处理) class DivCalculator : public Calculator { public: double calculate(double a, double b) override { if (b == 0) { throw std::invalid_argument("错误:除数不能为0"); } return a / b; } const char* getName() const override { return "除法器"; } }; #endif // CALCULATOR_H
3.2 工厂类实现(CalculatorFactory.h/.cpp) CalculatorFactory.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef CALCULATOR_FACTORY_H #define CALCULATOR_FACTORY_H #include "Calculator.h" #include <memory> // 用于智能指针(可选,推荐使用) // 工厂类:创建计算器实例 class CalculatorFactory { public: // 静态工厂方法:根据类型创建对应计算器(返回裸指针) static Calculator* createCalculator(CalculatorType type); // 重载:返回智能指针(推荐,自动管理内存,避免泄漏) static std::unique_ptr<Calculator> createUniqueCalculator(CalculatorType type); }; #endif // CALCULATOR_FACTORY_H
CalculatorFactory.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include "CalculatorFactory.h" #include "Calculator.h" // 静态工厂方法实现(裸指针版本) Calculator* CalculatorFactory::createCalculator(CalculatorType type) { switch (type) { case CalculatorType::ADD: return new AddCalculator(); // 创建加法器实例 case CalculatorType::SUB: return new SubCalculator(); // 创建减法器实例 case CalculatorType::MUL: return new MulCalculator(); // 创建乘法器实例 case CalculatorType::DIV: return new DivCalculator(); // 创建除法器实例 default: throw std::invalid_argument("错误:不支持的计算器类型"); } } // 静态工厂方法实现(智能指针版本) std::unique_ptr<Calculator> CalculatorFactory::createUniqueCalculator(CalculatorType type) { // 利用智能指针自动管理内存,无需手动delete return std::unique_ptr<Calculator>(createCalculator(type)); }
四、简单工厂模式缺点分析 工厂职责过重 :
扩展性局限 :
类型依赖 :
五、C++ 实现的适用场景
场景特征
典型案例
适配原因
产品类型较少且固定
支付方式创建(微信支付、支付宝支付)、日志器创建(文件日志、控制台日志)
工厂的switch分支不会过于复杂,维护成本低
需统一管理对象创建
数据库连接池、线程池中的对象创建
工厂可集中控制对象创建规则(如初始化参数、生命周期)
强调接口复用
插件系统的基础组件创建、框架中的核心模块实例化
通过抽象基类统一接口,调用者无需关注具体实现