【二十三种设计模式】

软件设计模式速查表(创建型/结构型/行为型)

创建型、结构型、行为型 三大类划分,提炼每类模式的核心解决问题、适用场景、核心思想、优缺点,无冗余代码,聚焦快速选型和理解,适配日常开发场景参考。

一、创建型模式(共5种)

核心:封装对象的创建过程,解耦对象创建与使用,应对对象创建的复杂场景,提升创建灵活性。

模式名称 核心解决问题 适用场景 核心思想 优点 缺点
单例模式 保证类在系统中仅一个实例 配置中心、连接池、日志对象等全局唯一组件 私有化构造器,统一实例入口 节省资源,全局统一状态 易引发线程安全问题,扩展困难
简单工厂模式 简化单个类的对象创建,统一创建入口 产品类型少、创建逻辑简单的场景 单独工厂类负责所有产品创建 解耦创建与使用,简化调用 产品增多时工厂类臃肿,违反开闭
工厂方法模式 解决简单工厂的产品扩展问题 产品类型多、需灵活扩展产品的场景 抽象工厂+具体工厂,一个工厂造一个产品 符合开闭,扩展方便 类数量翻倍,结构稍复杂
抽象工厂模式 创建一组相关/依赖的产品族 跨平台组件、框架适配(如UI组件+交互逻辑) 抽象工厂定义产品族创建接口,具体工厂实现 产品族扩展方便,保证产品一致性 新增产品种类时需修改抽象工厂,扩展繁琐
建造者模式 解决复杂对象(多属性、多步骤)创建 实体类属性多、创建步骤固定(如订单、对象初始化) 拆分对象构造与组装,建造者负责构造,指挥者负责组装 分步创建,属性灵活配置,解耦构造与组装 类数量多,简单对象使用冗余
原型模式 快速复制已有对象,替代重复new 对象创建成本高(如数据库查询后对象)、需批量创建相似对象 基于已有实例克隆生成新对象 提升创建效率,简化复杂对象创建 深克隆实现复杂,需处理引用类型

二、结构型模式(共7种)

核心:封装对象的组合/结构关系,通过合理的结构设计,实现类/对象的灵活复用、功能扩展,解决"结构适配"和"功能增强"问题。

模式名称 核心解决问题 适用场景 核心思想 优点 缺点
代理模式 为对象增加间接访问的附加功能 日志、权限、缓存、远程调用(如RPC) 为目标对象创建代理类,代理封装附加逻辑,转发核心调用 不修改目标对象,灵活增加功能 增加调用层级,轻微性能损耗
装饰器模式 动态为对象添加/移除功能 需灵活扩展功能、且不希望继承的场景(如IO流、日志增强) 装饰器与目标对象实现同一接口,嵌套包裹目标对象 无继承冗余,功能动态组合 多层装饰时代码可读性降低
适配器模式 解决接口不兼容的问题 集成第三方框架、老系统改造、接口适配 适配器包装适配者,转换为目标接口 无需修改原有代码,快速集成 增加适配器类,结构稍复杂
桥接模式 解决多维度变化的继承冗余 两个独立维度扩展(如笔:类型+颜色;消息:类型+推送方式) 将两个维度抽象为独立接口,通过组合替代继承 符合开闭,多维度独立扩展 抽象层增加,理解成本稍高
组合模式 统一单个对象对象集合的访问 树形结构场景(如菜单、部门组织、文件目录) 抽象节点+叶子节点+容器节点,统一节点操作接口 树形结构遍历/操作简化,新增节点方便 复杂树形结构时,节点判断逻辑繁琐
享元模式 复用系统中大量相似的细粒度对象 海量对象场景(如棋盘棋子、池化资源) 拆分对象为内部状态(共享)+外部状态(独用),共享池存储内部状态对象 大幅减少对象数量,节省内存 拆分状态复杂,需处理线程安全
外观模式 为复杂系统提供统一访问入口 框架调用、微服务聚合、老系统对外提供简单接口 定义外观类,封装子系统所有复杂调用,对外暴露简单方法 简化调用,降低系统耦合 外观类成为单点,易臃肿,子系统扩展可能影响外观类

三、行为型模式(共11种)

核心:封装对象之间的交互/行为,规范对象间的通信方式,解决对象协作的复杂问题,提升交互的灵活性和可复用性。

模式名称 核心解决问题 适用场景 核心思想 优点 缺点
策略模式 封装算法/业务规则的变化 支付方式、排序算法、校验规则等灵活切换的场景 抽象策略+具体策略,上下文持有策略对象,动态切换 符合开闭,算法切换灵活 策略类增多,调用者需了解所有策略
观察者模式 实现一对多的对象消息通知 事件监听、消息推送、状态同步(如MQ、前端事件) 被观察者维护观察者列表,状态变化时主动通知所有观察者 解耦观察者与被观察者,通知灵活 通知顺序不固定,易引发循环依赖
模板方法模式 统一算法骨架,灵活替换步骤 业务流程固定、部分步骤可定制(如登录流程、导出流程) 抽象类定义算法骨架,具体子类实现可变步骤 统一流程,步骤扩展方便 骨架修改需改抽象类,违反开闭
迭代器模式 统一不同容器的遍历方式 自定义集合、多容器遍历(如数组+链表+哈希表) 抽象迭代器定义遍历接口,具体迭代器实现,容器提供迭代器入口 遍历与容器解耦,统一遍历接口 简单容器使用冗余,增加类数量
责任链模式 多个对象依次处理请求,动态调整处理链 请求需多步骤处理(如接口校验、日志、权限)、处理流程需灵活调整 每个处理器持有下一个处理器引用,请求沿链传递 解耦请求与处理,流程动态配置 可能出现请求无人处理,调试困难
命令模式 请求封装为对象,解耦请求发起与执行 撤销/恢复操作、任务调度、按钮点击事件 命令封装请求,调用者调用命令,接收者执行命令 易实现撤销/恢复,请求可批量处理 类数量增多,简单请求使用冗余
状态模式 解决大量if-else的状态判断问题 对象状态多、状态转换复杂(如订单状态、电梯状态) 抽象状态+具体状态,对象状态由状态类管理,上下文委托状态类处理 消除if-else,状态转换清晰,扩展方便 状态类数量多,简单状态使用冗余
备忘录模式 保存对象的历史状态,支持恢复 编辑撤销、数据回滚、游戏存档 备忘录存储对象状态,管理者管理备忘录,原发器创建/恢复备忘录 不破坏对象封装,实现状态回滚 频繁保存会消耗大量内存
中介者模式 解决多个对象直接耦合的通信问题 多组件交互场景(如聊天室、电商订单与库存/支付) 中介者封装所有对象间的交互,对象仅与中介者通信 解耦对象间依赖,简化交互逻辑 中介者成为核心瓶颈,易臃肿
访问者模式 不同类型对象添加统一操作,且操作易扩展 对象结构固定、操作需频繁变化的场景(如数据解析、报表生成) 抽象访问者定义操作,具体访问者实现,元素接受访问者访问 操作扩展方便,无需修改元素类 元素结构变化时需修改所有访问者,违反开闭
解释器模式 实现简单语言/规则的解析执行 自定义简单规则(如表达式计算、配置规则解析) 抽象表达式+终结符/非终结符表达式,环境类存储全局信息 简单规则解析灵活,易扩展 复杂规则时表达式类爆炸,效率低

四、三大类模式核心选型思路

  1. 先看需求场景 :若需创建对象 →选创建型;若需组合类/对象结构 →选结构型;若需处理对象交互/行为→选行为型。
  2. 遵循设计原则 :优先选符合开闭原则(可扩展)的模式,如工厂方法替代简单工厂、装饰器替代继承扩展。
  3. 拒绝过度设计:简单场景用简单方案(如产品少用简单工厂,而非工厂方法;属性少的对象不用建造者),避免为了用模式而加冗余类。
  4. 组合使用 :实际开发中模式常组合,如单例+工厂 (全局唯一工厂)、装饰器+代理 (增强功能+附加逻辑)、观察者+中介者(解耦多对象通知)。
相关推荐
茶本无香10 小时前
设计模式之五—门面模式:简化复杂系统的统一接口
java·设计模式
小码过河.10 小时前
设计模式——模板方法模式
python·设计模式·模板方法模式
Engineer邓祥浩11 小时前
设计模式学习(19) 23-17 观察者模式
学习·观察者模式·设计模式
一条闲鱼_mytube11 小时前
智能体设计模式(六)资源感知优化-推理技术-评估与监控
网络·人工智能·设计模式
一条闲鱼_mytube11 小时前
智能体设计模式(七)优先级排序-探索与发现
网络·人工智能·设计模式
羞儿1 天前
Agent设计模式与工程化
设计模式·知识图谱·agent·rag·mcp·指导开发
点云SLAM1 天前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统
Yu_Lijing1 天前
基于C++的《Head First设计模式》笔记——状态模式
c++·笔记·设计模式
Engineer邓祥浩1 天前
设计模式学习(18) 23-16 迭代器模式
学习·设计模式·迭代器模式