文章

C++设计模式实战:掌握最核心的7种设计模式"

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-elseswitch-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, 延迟加载, 权限

💡 学习建议

  1. 不要为了用而用:设计模式是为了解决代码复用性、扩展性和维护性问题。如果代码很简单,直接写 if-else 可能更清晰。

  2. 组合优于继承:除了单例和工厂,上述大多数模式(策略、装饰器、代理、适配器)的核心思想都是组合(在一个类中包含另一个类的实例),而不是继承。

  3. 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)这三个入手。本项目提供了完整的代码实现,是学习设计模式的绝佳实践材料。


本文由作者按照 CC BY 4.0 进行授权