C++设计模式实战:掌握最核心的7种设计模式"
在软件工程中,虽然《设计模式》(GoF)一书列出了23种模式,但在实际开发中,最常用、最核心的通常只有7-8种。
掌握这几种模式,能解决80%以上的常见架构问题。本文将介绍一个C++设计模式实战项目,帮助你深入理解这些核心设计模式。
项目链接:design-patterns-cpp
项目简介
这是一个专注于C++设计模式实现的项目,包含了最常用的设计模式的实际代码示例。每个模式都配有完整的实现代码和测试用例,帮助开发者理解设计模式的实际应用。
核心设计模式
项目将设计模式分为三类,按使用频率和重要性排序:
🏆 第一梯队:必须掌握(出现频率最高)
1. 单例模式 (Singleton) - [创建型]
一句话解释:保证一个类只有一个实例,并提供全局访问点。
应用场景:
- 数据库连接池、线程池
- 日志记录器 (Logger)
- 配置管理器 (Config Manager)
C++实现要点:利用C++11局部静态变量的线程安全性(Meyers’ Singleton)
1
2
3
4
static MyClass& getInstance() {
static MyClass instance;
return instance;
}
项目中的实现位于 Singleton/ 目录,展示了配置管理器的单例实现。
2. 工厂模式 (Factory Method / Abstract Factory) - [创建型]
一句话解释:定义一个创建对象的接口,但让子类决定实例化哪一个类。将”对象的创建”与”对象的使用”解耦。
应用场景:
- 日志系统:根据配置输出到文件、控制台或网络
- UI框架:根据不同操作系统创建对应的按钮控件
- 数据库驱动:
DriverManager.getConnection()
核心价值:符合开闭原则(对扩展开放,对修改关闭)。新增一种产品只需新增一个类,无需修改原有代码。
项目中的实现位于 FactoryMethod/ 目录,展示了手机产品的工厂创建。
3. 观察者模式 (Observer) - [行为型]
一句话解释:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者都会自动收到通知并更新。
应用场景:
- 事件驱动系统:GUI中的按钮点击事件
- 消息队列:发布/订阅模型 (Pub/Sub)
- MVVM架构:数据变化自动更新UI
C++实现要点:通常维护一个 std::vector<std::function<void()>> 或接口指针列表。
项目中的实现位于 Observer/ 目录,并包含了C++11移动语义和转发语义的详细说明。
4. 策略模式 (Strategy) - [行为型]
一句话解释:定义一系列算法,把它们封装起来,并且使它们可相互替换。让算法的变化独立于使用算法的客户。
应用场景:
- 支付方式:支付宝、微信、信用卡,运行时切换
- 排序算法:根据数据量大小自动选择快速排序、归并排序或插入排序
- 游戏角色:不同角色的攻击行为(近战、远程、魔法)
核心价值:消除大量的 if-else 或 switch-case 语句。
项目中的实现位于 Strategy/ 目录,展示了商店折扣策略的实现。
🥈 第二梯队:非常实用(解决特定痛点)
5. 装饰器模式 (Decorator) - [结构型]
一句话解释:动态地给一个对象添加一些额外的职责。比生成子类更为灵活。
应用场景:
- Java I/O流:
new BufferedReader(new FileReader("file.txt")) - 功能增强:给咖啡添加糖、奶;给HTTP请求添加加密、压缩、日志功能
对比:继承是静态的,装饰器是动态的。
项目中的实现位于 Decorator/ 目录,展示了请求拦截器的实现。
6. 适配器模式 (Adapter) - [结构型]
一句话解释:将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
应用场景:
- 旧系统迁移:新代码需要调用旧的遗留系统接口
- 第三方库整合:统一接口,整合不同厂家的SDK
- 电源转换器:220V转110V
项目中的实现位于 Adapter/ 目录,展示了LLM(大语言模型)接口适配的实现。
7. 代理模式 (Proxy) - [结构型]
一句话解释:为其他对象提供一种代理以控制对这个对象的访问。
应用场景:
- 远程代理:RPC调用
- 虚拟代理:延迟加载大图片
- 保护代理:控制权限
- AOP (面向切面编程):事务控制、日志记录
项目中的实现位于 Proxy/ 目录,展示了网关代理的实现。
📊 总结与对比表
| 模式名称 | 类别 | 核心作用 | 典型关键词 |
|---|---|---|---|
| 单例 | 创建型 | 全局唯一 | static, 全局访问 |
| 工厂 | 创建型 | 解耦创建逻辑 | create, 多态创建 |
| 观察者 | 行为型 | 一对多通知 | notify, update, 事件总线 |
| 策略 | 行为型 | 算法互换 | interface, 消除 if-else |
| 装饰器 | 结构型 | 动态增强功能 | wrap, 层层嵌套 |
| 适配器 | 结构型 | 接口转换 | convert, 兼容旧接口 |
| 代理 | 结构型 | 控制访问 | proxy, 延迟加载, 权限 |
💡 学习建议
不要为了用而用:设计模式是为了解决代码复用性、扩展性和维护性问题。如果代码很简单,直接写
if-else可能更清晰。组合优于继承:除了单例和工厂,上述大多数模式(策略、装饰器、代理、适配器)的核心思想都是组合(在一个类中包含另一个类的实例),而不是继承。
C++特有视角:
- 在C++中,RAII (资源获取即初始化) 其实也是一种极其重要的”模式”,虽然不在GoF 23种里,但它管理生命周期的能力比单例更重要。
- 智能指针 (
std::shared_ptr,std::unique_ptr) 本质上实现了代理模式和部分装饰器模式的功能。
如何使用本项目
每个设计模式目录都包含:
- 完整的头文件和实现文件
- Makefile用于编译
- 测试文件展示使用示例
- README.md说明文档
例如,要编译和运行单例模式的示例:
1
2
3
cd Singleton
make
./singleton_test
总结
如果你正在学习C++设计模式,建议先从单例、策略(替换复杂的switch)和观察者(理解回调和lambda)这三个入手。本项目提供了完整的代码实现,是学习设计模式的绝佳实践材料。