C++ 23种设计模式的分类总结
以下是C++ 23种设计模式的分类总结表格:
类别 | 模式名称 | 核心思想 | 典型应用场景 | 注意事项 |
---|---|---|---|---|
创建型 | 单例模式 | 确保类仅存在一个实例,提供全局访问点 | 配置管理、日志系统、线程池 | 需处理线程安全;避免滥用导致测试困难 |
工厂方法模式 | 定义创建对象的接口,由子类决定实例化哪个类 | 日志系统(文件/控制台输出)、数据库连接(MySQL/PostgreSQL) | 新增产品需新增工厂类,可能导致类膨胀 | |
抽象工厂模式 | 提供接口创建一系列相关/依赖对象,无需指定具体类 | 跨平台UI组件(Windows/Linux控件族)、数据库访问层(多种数据库适配) | 新增产品族容易,新增产品类型需修改所有工厂 | |
建造者模式 | 分离复杂对象的构建与表示,分步构建对象 | 复杂配置对象(汽车、文档)、SQL语句构建器 | 产品结构简单时会增加复杂度 | |
原型模式 | 通过复制现有对象创建新对象,避免重复初始化 | 大对象复制(数据库连接、复杂文档)、游戏角色克隆 | 需正确实现深拷贝;适合对象相似性高的场景 | |
结构型 | 适配器模式 | 将一个类的接口转换为客户端期望的另一个接口 | 旧系统接口适配新框架、第三方库封装 | 优先用对象适配器(组合)而非类适配器(继承);避免过度适配 |
桥接模式 | 分离抽象与实现,使两者可独立扩展 | 跨平台图形库(形状抽象+平台绘制实现)、消息系统(消息类型+传输方式) | 适合多维度变化场景;避免抽象与实现层过度拆分 | |
组合模式 | 统一处理单个对象和组合对象,构建树形结构 | 文件系统、UI组件树、组织架构图 | 明确叶子与组合节点职责;递归操作需防栈溢出 | |
装饰模式 | 动态给对象添加功能,避免继承导致的类爆炸 | IO流包装(缓冲流、加密流)、咖啡加配料(牛奶、糖) | 装饰器与被装饰者需实现同一接口;避免多层装饰导致调试困难 | |
外观模式 | 为复杂子系统提供统一接口,简化访问 | 智能家居控制中心、数据库操作封装、第三方SDK包装 | 不封装子系统,客户端仍可直接访问;避免外观类过于庞大 | |
享元模式 | 共享相似对象减少内存消耗,分离内部状态(共享)与外部状态(非共享) | 游戏中的树木/粒子、文字处理中的字符、连接池 | 明确内外部状态划分;适合对象数量庞大且相似性高的场景 | |
代理模式 | 控制对对象的访问(远程、延迟加载、权限控制等) | 远程服务代理、大对象延迟加载(图片)、权限校验 | 代理与真实对象需实现同一接口;避免简单场景过度使用 | |
行为型 | 职责链模式 | 将请求传递给多个处理者,直到被处理 | 日志级别过滤、事件冒泡、审批流程 | 需考虑默认处理机制;避免链过长导致性能问题 |
命令模式 | 将请求封装为对象,支持撤销/重做、队列化请求 | 菜单操作、任务调度、事务管理 | 注意命令对象与接收者的生命周期管理;适合需要日志或回滚的场景 | |
解释器模式 | 定义语法规则并解析表达式 | 简单表达式计算、正则引擎、配置文件解析 | 适合简单语法;复杂语法会导致类爆炸 | |
迭代器模式 | 提供统一接口遍历聚合对象,不暴露内部结构 | 容器遍历(如STL迭代器)、树形结构遍历 | C++ STL已实现完善迭代器;需处理迭代器失效问题 | |
中介者模式 | 通过中介者减少对象间直接耦合,集中管理交互 | 聊天室、GUI组件交互、航空公司调度系统 | 避免中介者成为“上帝类”;适合交互复杂但规则固定的场景 | |
备忘录模式 | 保存对象状态以便后续恢复 | 游戏存档、编辑器撤销功能、事务回滚 | 可能占用大量内存;需控制备忘录访问权限 | |
观察者模式 | 状态变化时通知依赖对象(发布-订阅) | 事件监听、数据更新通知(如股票行情)、UI与数据绑定 | 处理观察者生命周期;可支持事件过滤 | |
状态模式 | 对象状态变化时行为随之改变,将状态逻辑封装到状态类 | 订单状态流转、电梯运行状态、播放器状态 | 避免上下文类中大量if-else ;适合状态固定且转换规则明确的场景 | |
策略模式 | 定义算法家族,动态选择使用,避免if-else 判断 | 排序算法切换、支付方式选择、日志输出策略 | 客户端需知道所有策略;策略应无状态可共享 | |
模板方法模式 | 定义算法骨架,子类实现可变步骤 | 流程化任务(数据处理、游戏角色升级)、框架钩子方法 | 模板方法通常声明为final ;通过钩子方法扩展灵活性 | |
访问者模式 | 为复杂对象结构添加新操作,不修改对象类 | 文档导出(PDF/HTML)、数据统计、复杂结构遍历 | 元素类新增时需修改所有访问者;适合结构稳定但操作多变的场景 |
总结
- 设计模式的核心是解耦与复用,需结合具体场景选择,避免过度设计。
- 创建型模式关注“对象如何创建”,结构型模式关注“对象如何组合”,行为型模式关注“对象如何交互”。
- 实际开发中优先使用C++标准库或成熟框架中已实现的模式(如STL迭代器、智能指针的RAII)。