C++ 设计模式
1. 创建型模式 (Creational Patterns)
| 模式 | 用途 | 关键点 |
|---|---|---|
| Singleton(单例) | 保证类只有一个实例,并提供全局访问点 | 懒加载、线程安全、全局访问 |
| Factory Method(工厂方法) | 定义创建对象的接口,让子类决定实例化哪一个类 | 接口+子类实现、解耦对象创建 |
| Abstract Factory(抽象工厂) | 创建一系列相关或依赖对象 | 提供接口创建多类产品族 |
| Builder(建造者) | 将复杂对象的构建与表示分离 | 分步构建、支持不同表现 |
| Prototype(原型) | 通过复制已有对象创建新对象 | clone 方法、减少 new 依赖 |
2. 结构型模式 (Structural Patterns)
| 模式 | 用途 | 关键点 |
|---|---|---|
| Adapter(适配器) | 转换接口,使类可用 | 类适配/对象适配、解耦客户端与被适配类 |
| Bridge(桥接) | 抽象与实现分离 | 抽象类持有实现接口,支持独立变化 |
| Composite(组合) | 组成树形结构表示部分-整体 | 统一对待叶子和组合对象 |
| Decorator(装饰器) | 动态添加对象职责 | 透明包装、增强功能 |
| Facade(外观) | 简化子系统接口 | 提供统一接口,降低复杂度 |
| Flyweight(享元) | 共享对象,减少内存占用 | 内部状态共享、外部状态独立 |
| Proxy(代理) | 控制对象访问 | 访问控制、延迟加载、保护 |
3. 行为型模式 (Behavioral Patterns)
| 模式 | 用途 | 关键点 |
|---|---|---|
| Observer(观察者) | 一对多依赖,状态变化通知 | 发布-订阅、解耦 |
| Strategy(策略) | 封装算法,可互换 | 算法接口+具体实现 |
| Command(命令) | 封装请求为对象 | 请求参数化、队列化、日志 |
| Iterator(迭代器) | 顺序访问聚合对象 | 隐藏内部结构、统一访问方式 |
| Template Method(模板方法) | 定义算法骨架,子类实现部分步骤 | 算法复用、可扩展步骤 |
| Mediator(中介者) | 封装对象间交互 | 减少耦合、集中控制 |
| State(状态) | 对象行为随状态改变 | 状态类封装行为,Context 管理 |
| Chain of Responsibility(责任链) | 请求沿链传递,直到处理 | 松耦合、动态链路 |
| Visitor(访问者) | 封装操作,作用于对象结构 | 对象数据结构与操作分离 |
C++设计原则
1. SOLID 原则
| 原则 | 含义 | 关键点 |
|---|---|---|
| S - Single Responsibility Principle (单一职责原则) | 一个类只负责一类职责 | 每个类/模块只做一件事,修改原因单一 |
| O - Open/Closed Principle (开闭原则) | 对扩展开放,对修改封闭 | 新功能通过扩展实现,不修改已有代码 |
| L - Liskov Substitution Principle (里氏替换原则) | 子类应能替换父类 | 子类对象可以替代父类对象而不破坏程序 |
| I - Interface Segregation Principle (接口隔离原则) | 多个专门接口优于单一总接口 | 使用小接口,避免冗余实现 |
| D - Dependency Inversion Principle (依赖倒置原则) | 高层模块不依赖低层模块,二者依赖抽象 | 依赖抽象而非具体类,降低耦合 |
2. 其他常用设计原则
| 原则 | 含义 | 关键点 |
|---|---|---|
| DRY (Don't Repeat Yourself) | 避免重复代码 | 提取公共功能,减少重复实现 |
| KISS (Keep It Simple, Stupid) | 保持设计简单 | 简单优于复杂,易理解易维护 |
| YAGNI (You Aren't Gonna Need It) | 不要过度设计 | 只实现当前需要功能,不做未来臆想功能 |
| Law of Demeter (最少知识原则) | 只和直接朋友通信 | 减少对象间耦合,不调用链式对象的方法 |
| Composition over Inheritance (组合优于继承) | 优先使用对象组合而非类继承 | 更灵活,降低耦合,易扩展 |
| Favor Polymorphism over Conditionals | 优先使用多态而非条件分支 | 通过虚函数/接口替代大量 if/switch |
3. C++ 特有的设计注意点
| 原则/习惯 | 含义 | 关键点 |
|---|---|---|
| RAII (Resource Acquisition Is Initialization) | 资源管理与对象生命周期绑定 | 析构自动释放资源,如智能指针、锁管理 |
| Rule of 0 / 3 / 5 | 拷贝/移动操作规范 | 如果需要自定义析构、拷贝、移动等操作,要遵循规则 |
| Const Correctness | 使用 const 修饰不可变对象 | 增强可读性,防止误修改 |
| Prefer Smart Pointers over Raw Pointers | 使用智能指针管理动态资源 | 避免内存泄漏,提高异常安全性 |
| Avoid Naked new/delete | 避免手动 new/delete | 用容器或智能指针管理资源 |
| ** noexcept 使用** | 明确函数不抛异常 | 有助于优化和安全资源释放 |
总结
-
SOLID + DRY/KISS/YAGNI + RAII/Rule of 0/5/3 是现代 C++ 核心设计原则
-
这些原则的目标是:高内聚、低耦合、易扩展、易维护
-
实际项目中,设计模式 + 设计原则结合使用效果最好