一些设计模式的记忆点
一、先看总原则
- 创建对象麻烦
用创建型模式
- 类或对象的组合关系复杂
用结构型模式
- 对象之间职责划分、通信流程复杂
用行为型模式
二、不同设计模式适合的场景
(一)创建型模式:解决“对象怎么创建”
- 单例模式(Singleton)
适合场景:
- 系统中某个类只能有一个实例
- 如配置管理器、线程池、缓存管理器、日志对象
关键词:
- 唯一实例
- 全局访问点
记忆点:
- “一个类只有一个对象”基本就是单例
- 工厂方法模式(Factory Method)
适合场景:
- 需要创建对象,但不想直接 new
- 不同条件下创建不同具体产品
- 如不同数据库连接、不同导出器、不同支付方式对象
关键词:
- 延迟实例化
- 子类决定创建哪种对象
记忆点:
- 关注“创建一个等级结构中的某一个产品”
- 抽象工厂模式(Abstract Factory)
适合场景:
- 要创建一整组相关或相互依赖的对象
- 如不同风格 UI 组件:Windows 风格按钮、文本框;Mac 风格按钮、文本框
- 不同数据库族:连接、命令、结果集统一切换
关键词:
- 产品族
- 成套创建
记忆点:
- 工厂方法是“一个产品”
- 抽象工厂是“一族产品”
- 建造者模式(Builder)
适合场景:
- 对象构造过程复杂,步骤多,但步骤顺序稳定
- 如组装电脑、构建 SQL、创建复杂报表、创建复杂请求对象
关键词:
- 分步构建
- 构建过程与表示分离
记忆点:
- “复杂对象一步步组装”就是建造者
- 原型模式(Prototype)
适合场景:
- 创建对象成本高,复制比重新创建更高效
- 如图形对象复制、配置模板复制、带大量初始化数据的对象
关键词:
- 克隆
- 复制现有对象
记忆点:
- 区分浅拷贝、深拷贝是常见延伸点
(二)结构型模式:解决“类和对象怎么组织”
- 适配器模式(Adapter)
适合场景:
- 已有类能用,但接口不兼容
- 老系统对接新系统
- 第三方接口封装
关键词:
- 接口转换
- 兼容旧接口
记忆点:
- 核心是“让本来不能一起工作的类可以一起工作”
- 桥接模式(Bridge)
适合场景:
- 存在两个独立变化维度,希望分别扩展
- 如消息类型(普通/紧急)和发送方式(短信/邮件)都在变化
- 图形形状和绘制平台都要扩展
关键词:
- 抽象与实现分离
- 多维度变化
记忆点:
- 如果题目说“两个维度都要扩展,避免类爆炸”,多半是桥接
- 组合模式(Composite)
适合场景:
- 树形结构
- 如文件夹/文件、菜单/子菜单、组织架构
关键词:
- 部分—整体
- 树形结构统一处理
记忆点:
- 叶子节点和容器节点统一对待
- 装饰器模式(Decorator)
适合场景:
- 动态给对象增加功能,不想修改原类
- 如 I/O 流加缓冲、加加密、加日志
- 给组件附加权限校验、统计功能
关键词:
- 动态增强
- 比继承更灵活
记忆点:
- 与代理模式容易混淆
- 装饰器强调“增强功能”
- 外观模式(Facade)
适合场景:
- 子系统复杂,希望对外提供统一简单入口
- 如一键启动流程、统一服务入口、SDK 封装
关键词:
- 简化调用
- 统一入口
记忆点:
- 核心是“隐藏子系统复杂性”
- 享元模式(Flyweight)
适合场景:
- 系统中有大量细粒度对象,内存占用大
- 如字符对象、棋子对象、图标对象
关键词:
- 共享对象
- 节省内存
记忆点:
- 区分内部状态与外部状态
- 代理模式(Proxy)
适合场景:
- 需要控制对对象的访问
- 如远程代理、虚代理、权限代理、缓存代理
关键词:
- 控制访问
- 间接访问真实对象
记忆点:
- 与装饰器区分:
- 代理:控制访问
- 装饰器:增强功能
(三)行为型模式:解决“对象之间怎么协作”
- 策略模式(Strategy)
适合场景:
- 有多种算法或业务规则可互换
- 如支付策略、折扣策略、排序策略、路由策略
关键词:
- 算法封装
- 可互换
记忆点:
- “同一问题,多种算法可切换”就是策略
- 模板方法模式(Template Method)
适合场景:
- 流程固定,但某些步骤实现不同
- 如报表生成流程、数据导入流程、考试流程
关键词:
- 定义算法骨架
- 子类重写具体步骤
记忆点:
- “整体流程不变,细节步骤可变”就是模板方法
- 观察者模式(Observer)
适合场景:
- 一个对象状态变化,要通知多个对象
- 如事件监听、消息订阅、UI 联动、发布订阅
关键词:
- 一对多通知
- 发布—订阅
记忆点:
- 题干出现“通知多个依赖对象”基本就是观察者
- 责任链模式(Chain of Responsibility)
适合场景:
- 多个对象都可能处理同一个请求,谁处理运行时决定
- 如审批流程、过滤器链、异常处理链
关键词:
- 请求沿链传递
- 解耦发送者和接收者
记忆点:
- 常见于工作流、过滤器、权限校验链
- 命令模式(Command)
适合场景:
- 需要把请求封装成对象
- 支持撤销/重做、请求队列、日志记录
- 如菜单操作、遥控器、事务操作
关键词:
- 请求对象化
- 支持撤销、排队
记忆点:
- “请求发送者与执行者解耦”是命令模式核心
- 状态模式(State)
适合场景:
- 对象在不同状态下行为不同
- 如订单状态、工作流状态、播放器状态、TCP 连接状态
关键词:
- 状态变化引起行为变化
- 消除大量 if-else
记忆点:
- 与策略模式易混淆
- 策略:主动切换算法
- 状态:状态变化驱动行为变化
- 迭代器模式(Iterator)
适合场景:
- 顺序访问聚合对象中的元素,而不暴露内部结构
- 如遍历集合、列表、树结构
关键词:
- 统一遍历接口
- 隐藏内部结构
记忆点:
- 主要用于集合遍历
- 中介者模式(Mediator)
适合场景:
- 多个对象之间交互复杂,网状依赖严重
- 如聊天系统、界面控件协作、航班调度
关键词:
- 集中协调
- 降低对象间耦合
记忆点:
- “对象间不直接通信,都通过中间者协调”
- 备忘录模式(Memento)
适合场景:
- 需要保存对象历史状态,以便恢复
- 如撤销、回滚、存档点
关键词:
- 状态快照
- 恢复历史状态
记忆点:
- 常和命令模式一起出现
- 访问者模式(Visitor)
适合场景:
- 数据结构相对稳定,但对其进行的操作经常变化
- 如编译器语法树处理、报表统计、对象结构分析
关键词:
- 操作与数据结构分离
- 易于新增操作
记忆点:
- “结构稳定、操作多变”是判断关键
- 解释器模式(Interpreter)
适合场景:
- 需要定义语法规则并解释执行
- 如表达式计算、规则引擎、简单脚本解析
关键词:
- 语法解释
- 表达式求值
记忆点:
- 适合简单语言或规则系统,不适合特别复杂语法
三、软考最常考的几个区分
- 工厂方法 vs 抽象工厂
- 工厂方法:创建一种产品
- 抽象工厂:创建一族产品
- 装饰器 vs 代理
- 装饰器:增强功能
- 代理:控制访问
- 策略 vs 状态
- 策略:多种算法任选其一
- 状态:对象状态改变导致行为变化
- 模板方法 vs 策略
- 模板方法:流程骨架固定,细节延迟到子类
- 策略:算法整体可替换
- 适配器 vs 桥接
- 适配器:解决现有接口不兼容
- 桥接:解决两个维度独立变化




