当前位置: 首页 > news >正文

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)。
http://www.lryc.cn/news/620864.html

相关文章:

  • 使用DevEco Studio运行鸿蒙项目,屏蔽控制台无关日志,过滤需要的日志
  • Lua 脚本在 Redis 中的应用
  • 【科研绘图系列】R语言绘制微生物丰度和基因表达值的相关性网络图
  • 构建Node.js单可执行应用(SEA)的方法
  • 01数据结构-最短路径Dijkstra
  • 【HarmonyOS】Window11家庭中文版开启鸿蒙模拟器失败提示未开启Hyoer-V
  • JavaScript方法借用技术详解
  • HarmonyOS ArkUI 实现商品分类布局
  • C++进阶:特殊类
  • Morph Studio-一站式AI视频创作平台
  • postgresql运维问题解决:PG集群备节点状态异常告警处理
  • CVPR 2025 | 北大团队SLAM3R:单目RGB长视频实时重建,精度效率双杀!
  • 小杰python高级(six day)——pandas库
  • 一篇文章读懂.Net的依赖注入
  • C#WPF实战出真汁00--项目介绍
  • 融合服务器助力下的电视信息发布直播点播系统革新
  • 【测试用例】软件测试用例编写规范
  • 第三集 测试用例
  • [Android] 二十四节气日历v1.0.3 - 弘扬传统文化,精致设计,无广告纯净体验!
  • 在 CentOS 7 中使用 systemd 创建自定义服务
  • Java 设计模式-装饰器模式
  • 线程P4 | 线程安全问题及解决方法
  • Linux信号产生
  • Linux下使用Samba 客户端访问 Samba 服务器的配置(Ubuntu Debian)
  • mysql 提示符及快捷执行
  • 从零开始搭建React+TypeScript+webpack开发环境——基于MobX的枚举数据缓存方案设计与实践
  • React 数据持久化:从 “刷新就丢“ 到 “永存不灭“ 的实现方案
  • WEBSTORM前端 —— 第4章:JavaScript —— 第3节:数据类型与类型转换
  • Streamlit实现Qwen对话机器人
  • Pytest自动化测试框架总结