🎯 用现代 C++20 实现 24 种经典设计模式
📦 项目结构清晰,支持自动化构建与文档生成
🧩 每个模式独立可运行,注释完整,适合学习与工程实践
📚 支持 Doxygen 自动生成 HTML 文档
🚀 零裸指针、零内存泄漏、RAII + 智能指针
创建型模式关注 对象的创建机制,帮助系统独立于对象的创建、组合和表示方式。它们通过抽象化实例化过程,使代码更具灵活性和可扩展性。
模式 | 说明 | 现代 C++ 实现要点 |
---|---|---|
Singleton | 确保一个类只有一个实例,并提供全局访问点 | Meyers' Singleton + CRTP 基类 |
Simple Factory | 通过工厂类创建不同产品,客户端无需知道具体类 | std::map<char, std::function<unique_ptr<T>()>> |
Factory Method | 将对象创建延迟到子类 | 模板工厂 SimpleFactory<T> |
Abstract Factory | 创建一组相关或依赖对象的家族 | 模板族工厂 SimpleDeviceFactory<K, M> |
Builder | 将复杂对象的构建与表示分离 | 流式接口(Fluent Interface)+ 移动语义 |
Prototype | 通过克隆现有对象创建新对象 | clone() + std::unique_ptr + CRTP |
结构型模式关注 如何组合类和对象以获得更大的结构。它们通过继承或组合来设计更灵活的结构。
模式 | 说明 | 现代 C++ 实现要点 |
---|---|---|
Adapter | 将一个类的接口转换成客户端期望的另一个接口 | 对象适配器 + 智能指针 |
Bridge | 分离抽象与实现,使两者独立变化 | 组合 + 依赖注入 |
Composite | 将对象组合成树形结构以表示“部分-整体”层次 | Component 接口 + 递归遍历 |
Decorator | 动态地为对象添加职责 | 组合 + 多层包装 |
Facade | 为复杂子系统提供一个简单接口 | 门面类封装多步骤流程 |
Flyweight | 通过共享技术支持大量细粒度对象 | 内在状态共享 + 外在状态外部化 |
Proxy | 控制对对象的访问 | 代理链 + 权限/日志增强 |
行为型模式关注 对象之间的职责分配与通信机制。它们帮助对象在运行时动态地交互。
模式 | 说明 | 现代 C++ 实现要点 |
---|---|---|
Observer | 定义对象间的一对多依赖关系 | 事件总线 + std::function + RAII 注销 |
Strategy | 定义一系列算法并封装 | std::function + 策略注入 + 函数式风格 |
Command | 将请求封装为对象 | 命令队列 + 撤销/重做 + 智能指针 |
State | 允许对象在其内部状态改变时改变行为 | std::unique_ptr<State> + enter/exit 回调 |
Template Method | 定义算法骨架,子类重写步骤 | 非虚接口(NVI) + 钩子方法 |
Iterator | 提供一种方式遍历聚合对象 | 自定义迭代器 + 支持范围 for 循环 |
Chain of Responsibility | 将请求沿链传递 | 流式构建器 + 撤销栈 |
Mediator | 用中介对象封装对象间的交互 | 事件总线 + 发布-订阅 + std::weak_ptr |
Memento | 捕获并外部化对象的内部状态 | std::unique_ptr<Memento> + undo/redo 栈 |
Visitor | 在不修改类的前提下添加新操作 | 双分派 + std::variant 替代方案 |
Interpreter | 定义语言的文法表示 | 递归下降解析器 + AST + 异常安全 |
这些是 C++ 工程师的“内功心法”,用于构建高性能、可维护的现代 C++ 库。
模式 | 说明 | 现代 C++ 实现要点 |
---|---|---|
Pimpl | 隐藏实现细节,减少编译依赖 | std::unique_ptr<Impl> + 多种实现方式 |
Named Constructor | 提供语义化构造方式 | 静态工厂函数 + 可读性提升 |
CRTP | 静态多态,零成本抽象 | 奇异递归模板 + 混入(Mixin) |
SFINAE | 条件编译,模板重载控制 | std::enable_if + void_t 技巧 |
Rule of Zero | 依赖 RAII,避免手动资源管理 | 智能指针 + 默认特殊成员函数 |
Policy-Based Design | 策略式设计,行为可组合 | 模板参数注入行为 |
C++20 Concepts | 类型约束,替代 SFINAE | template<Arithmetic T> |
C++20 Coroutines | 协程,异步编程新范式 | generator<T> + co_yield |
Three-way Comparison | 三路比较运算符 | <=> 替代手动实现 == , < 等 |
Expression Templates | 延迟计算,避免临时对象 | 用于高性能数学库(如 Eigen) |
Template Specialization | 为特定类型提供特化 | template<> struct Printer<int> |
Tag Dispatching | 通过标签选择重载 | std::iterator_traits + 优化路径 |
Type Erasure | 隐藏具体类型 | AnyDrawable + 多态 + std::function |
Empty Base Optimization (EBO) | 空基类优化 | 减少内存占用,[[no_unique_address]] |
# 1. 创建构建目录
mkdir build && cd build
# 2. 配置项目(使用 Ninja)
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug
# 3. 构建所有模式
cmake --build .
# 4. 运行某个模式
./singleton
./factory_method
./builder
./observer
./strategy
./visitor
# ...