一、简单工厂

简单工厂模式的核心是通过一个工厂类统一创建不同产品实例,本质是将对象创建逻辑与使用逻辑分离。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));
}

四、简单工厂模式缺点分析

工厂职责过重

  • 所有产品的创建逻辑集中在一个工厂类中,若产品类型过多,switch分支会过于复杂,维护成本升高

  • 违反 “单一职责原则”(工厂既负责创建加法器,又负责创建除法器等)

扩展性局限

  • 新增产品时需修改工厂类的switch语句,严格来说违反 “开闭原则”(对扩展开放,对修改关闭)

  • 无法动态扩展工厂能力(如在运行时新增产品类型),需编译期提前定义所有产品类型

类型依赖

  • 调用者需知道产品类型枚举(CalculatorType),若产品类型频繁变化,调用者代码也需同步修改

  • 无法通过字符串等动态输入直接创建产品(需额外添加类型映射逻辑)

五、C++ 实现的适用场景

场景特征 典型案例 适配原因
产品类型较少且固定 支付方式创建(微信支付、支付宝支付)、日志器创建(文件日志、控制台日志) 工厂的switch分支不会过于复杂,维护成本低
需统一管理对象创建 数据库连接池、线程池中的对象创建 工厂可集中控制对象创建规则(如初始化参数、生命周期)
强调接口复用 插件系统的基础组件创建、框架中的核心模块实例化 通过抽象基类统一接口,调用者无需关注具体实现