软件设计模式速查表(创建型/结构型/行为型)
按创建型、结构型、行为型 三大类划分,提炼每类模式的核心解决问题、适用场景、核心思想、优缺点,无冗余代码,聚焦快速选型和理解,适配日常开发场景参考。
一、创建型模式(共5种)
核心:封装对象的创建过程,解耦对象创建与使用,应对对象创建的复杂场景,提升创建灵活性。
| 模式名称 | 核心解决问题 | 适用场景 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 单例模式 | 保证类在系统中仅一个实例 | 配置中心、连接池、日志对象等全局唯一组件 | 私有化构造器,统一实例入口 | 节省资源,全局统一状态 | 易引发线程安全问题,扩展困难 |
| 简单工厂模式 | 简化单个类的对象创建,统一创建入口 | 产品类型少、创建逻辑简单的场景 | 单独工厂类负责所有产品创建 | 解耦创建与使用,简化调用 | 产品增多时工厂类臃肿,违反开闭 |
| 工厂方法模式 | 解决简单工厂的产品扩展问题 | 产品类型多、需灵活扩展产品的场景 | 抽象工厂+具体工厂,一个工厂造一个产品 | 符合开闭,扩展方便 | 类数量翻倍,结构稍复杂 |
| 抽象工厂模式 | 创建一组相关/依赖的产品族 | 跨平台组件、框架适配(如UI组件+交互逻辑) | 抽象工厂定义产品族创建接口,具体工厂实现 | 产品族扩展方便,保证产品一致性 | 新增产品种类时需修改抽象工厂,扩展繁琐 |
| 建造者模式 | 解决复杂对象(多属性、多步骤)创建 | 实体类属性多、创建步骤固定(如订单、对象初始化) | 拆分对象构造与组装,建造者负责构造,指挥者负责组装 | 分步创建,属性灵活配置,解耦构造与组装 | 类数量多,简单对象使用冗余 |
| 原型模式 | 快速复制已有对象,替代重复new | 对象创建成本高(如数据库查询后对象)、需批量创建相似对象 | 基于已有实例克隆生成新对象 | 提升创建效率,简化复杂对象创建 | 深克隆实现复杂,需处理引用类型 |
二、结构型模式(共7种)
核心:封装对象的组合/结构关系,通过合理的结构设计,实现类/对象的灵活复用、功能扩展,解决"结构适配"和"功能增强"问题。
| 模式名称 | 核心解决问题 | 适用场景 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 代理模式 | 为对象增加间接访问的附加功能 | 日志、权限、缓存、远程调用(如RPC) | 为目标对象创建代理类,代理封装附加逻辑,转发核心调用 | 不修改目标对象,灵活增加功能 | 增加调用层级,轻微性能损耗 |
| 装饰器模式 | 动态为对象添加/移除功能 | 需灵活扩展功能、且不希望继承的场景(如IO流、日志增强) | 装饰器与目标对象实现同一接口,嵌套包裹目标对象 | 无继承冗余,功能动态组合 | 多层装饰时代码可读性降低 |
| 适配器模式 | 解决接口不兼容的问题 | 集成第三方框架、老系统改造、接口适配 | 适配器包装适配者,转换为目标接口 | 无需修改原有代码,快速集成 | 增加适配器类,结构稍复杂 |
| 桥接模式 | 解决多维度变化的继承冗余 | 两个独立维度扩展(如笔:类型+颜色;消息:类型+推送方式) | 将两个维度抽象为独立接口,通过组合替代继承 | 符合开闭,多维度独立扩展 | 抽象层增加,理解成本稍高 |
| 组合模式 | 统一单个对象 和对象集合的访问 | 树形结构场景(如菜单、部门组织、文件目录) | 抽象节点+叶子节点+容器节点,统一节点操作接口 | 树形结构遍历/操作简化,新增节点方便 | 复杂树形结构时,节点判断逻辑繁琐 |
| 享元模式 | 复用系统中大量相似的细粒度对象 | 海量对象场景(如棋盘棋子、池化资源) | 拆分对象为内部状态(共享)+外部状态(独用),共享池存储内部状态对象 | 大幅减少对象数量,节省内存 | 拆分状态复杂,需处理线程安全 |
| 外观模式 | 为复杂系统提供统一访问入口 | 框架调用、微服务聚合、老系统对外提供简单接口 | 定义外观类,封装子系统所有复杂调用,对外暴露简单方法 | 简化调用,降低系统耦合 | 外观类成为单点,易臃肿,子系统扩展可能影响外观类 |
三、行为型模式(共11种)
核心:封装对象之间的交互/行为,规范对象间的通信方式,解决对象协作的复杂问题,提升交互的灵活性和可复用性。
| 模式名称 | 核心解决问题 | 适用场景 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 策略模式 | 封装算法/业务规则的变化 | 支付方式、排序算法、校验规则等灵活切换的场景 | 抽象策略+具体策略,上下文持有策略对象,动态切换 | 符合开闭,算法切换灵活 | 策略类增多,调用者需了解所有策略 |
| 观察者模式 | 实现一对多的对象消息通知 | 事件监听、消息推送、状态同步(如MQ、前端事件) | 被观察者维护观察者列表,状态变化时主动通知所有观察者 | 解耦观察者与被观察者,通知灵活 | 通知顺序不固定,易引发循环依赖 |
| 模板方法模式 | 统一算法骨架,灵活替换步骤 | 业务流程固定、部分步骤可定制(如登录流程、导出流程) | 抽象类定义算法骨架,具体子类实现可变步骤 | 统一流程,步骤扩展方便 | 骨架修改需改抽象类,违反开闭 |
| 迭代器模式 | 统一不同容器的遍历方式 | 自定义集合、多容器遍历(如数组+链表+哈希表) | 抽象迭代器定义遍历接口,具体迭代器实现,容器提供迭代器入口 | 遍历与容器解耦,统一遍历接口 | 简单容器使用冗余,增加类数量 |
| 责任链模式 | 让多个对象依次处理请求,动态调整处理链 | 请求需多步骤处理(如接口校验、日志、权限)、处理流程需灵活调整 | 每个处理器持有下一个处理器引用,请求沿链传递 | 解耦请求与处理,流程动态配置 | 可能出现请求无人处理,调试困难 |
| 命令模式 | 将请求封装为对象,解耦请求发起与执行 | 撤销/恢复操作、任务调度、按钮点击事件 | 命令封装请求,调用者调用命令,接收者执行命令 | 易实现撤销/恢复,请求可批量处理 | 类数量增多,简单请求使用冗余 |
| 状态模式 | 解决大量if-else的状态判断问题 | 对象状态多、状态转换复杂(如订单状态、电梯状态) | 抽象状态+具体状态,对象状态由状态类管理,上下文委托状态类处理 | 消除if-else,状态转换清晰,扩展方便 | 状态类数量多,简单状态使用冗余 |
| 备忘录模式 | 保存对象的历史状态,支持恢复 | 编辑撤销、数据回滚、游戏存档 | 备忘录存储对象状态,管理者管理备忘录,原发器创建/恢复备忘录 | 不破坏对象封装,实现状态回滚 | 频繁保存会消耗大量内存 |
| 中介者模式 | 解决多个对象直接耦合的通信问题 | 多组件交互场景(如聊天室、电商订单与库存/支付) | 中介者封装所有对象间的交互,对象仅与中介者通信 | 解耦对象间依赖,简化交互逻辑 | 中介者成为核心瓶颈,易臃肿 |
| 访问者模式 | 为不同类型对象添加统一操作,且操作易扩展 | 对象结构固定、操作需频繁变化的场景(如数据解析、报表生成) | 抽象访问者定义操作,具体访问者实现,元素接受访问者访问 | 操作扩展方便,无需修改元素类 | 元素结构变化时需修改所有访问者,违反开闭 |
| 解释器模式 | 实现简单语言/规则的解析执行 | 自定义简单规则(如表达式计算、配置规则解析) | 抽象表达式+终结符/非终结符表达式,环境类存储全局信息 | 简单规则解析灵活,易扩展 | 复杂规则时表达式类爆炸,效率低 |
四、三大类模式核心选型思路
- 先看需求场景 :若需创建对象 →选创建型;若需组合类/对象结构 →选结构型;若需处理对象交互/行为→选行为型。
- 遵循设计原则 :优先选符合开闭原则(可扩展)的模式,如工厂方法替代简单工厂、装饰器替代继承扩展。
- 拒绝过度设计:简单场景用简单方案(如产品少用简单工厂,而非工厂方法;属性少的对象不用建造者),避免为了用模式而加冗余类。
- 组合使用 :实际开发中模式常组合,如单例+工厂 (全局唯一工厂)、装饰器+代理 (增强功能+附加逻辑)、观察者+中介者(解耦多对象通知)。