一些设计模式的记忆点

一、先看总原则

  1. 创建对象麻烦

用创建型模式

  1. 类或对象的组合关系复杂

用结构型模式

  1. 对象之间职责划分、通信流程复杂

用行为型模式


二、不同设计模式适合的场景


(一)创建型模式:解决“对象怎么创建”

  1. 单例模式(Singleton)

适合场景:

  • 系统中某个类只能有一个实例
  • 如配置管理器、线程池、缓存管理器、日志对象

关键词:

  • 唯一实例
  • 全局访问点

记忆点:

  • “一个类只有一个对象”基本就是单例

  1. 工厂方法模式(Factory Method)

适合场景:

  • 需要创建对象,但不想直接 new
  • 不同条件下创建不同具体产品
  • 如不同数据库连接、不同导出器、不同支付方式对象

关键词:

  • 延迟实例化
  • 子类决定创建哪种对象

记忆点:

  • 关注“创建一个等级结构中的某一个产品”

  1. 抽象工厂模式(Abstract Factory)

适合场景:

  • 要创建一整组相关或相互依赖的对象
  • 如不同风格 UI 组件:Windows 风格按钮、文本框;Mac 风格按钮、文本框
  • 不同数据库族:连接、命令、结果集统一切换

关键词:

  • 产品族
  • 成套创建

记忆点:

  • 工厂方法是“一个产品”
  • 抽象工厂是“一族产品”

  1. 建造者模式(Builder)

适合场景:

  • 对象构造过程复杂,步骤多,但步骤顺序稳定
  • 如组装电脑、构建 SQL、创建复杂报表、创建复杂请求对象

关键词:

  • 分步构建
  • 构建过程与表示分离

记忆点:

  • “复杂对象一步步组装”就是建造者

  1. 原型模式(Prototype)

适合场景:

  • 创建对象成本高,复制比重新创建更高效
  • 如图形对象复制、配置模板复制、带大量初始化数据的对象

关键词:

  • 克隆
  • 复制现有对象

记忆点:

  • 区分浅拷贝、深拷贝是常见延伸点

(二)结构型模式:解决“类和对象怎么组织”

  1. 适配器模式(Adapter)

适合场景:

  • 已有类能用,但接口不兼容
  • 老系统对接新系统
  • 第三方接口封装

关键词:

  • 接口转换
  • 兼容旧接口

记忆点:

  • 核心是“让本来不能一起工作的类可以一起工作”

  1. 桥接模式(Bridge)

适合场景:

  • 存在两个独立变化维度,希望分别扩展
  • 如消息类型(普通/紧急)和发送方式(短信/邮件)都在变化
  • 图形形状和绘制平台都要扩展

关键词:

  • 抽象与实现分离
  • 多维度变化

记忆点:

  • 如果题目说“两个维度都要扩展,避免类爆炸”,多半是桥接

  1. 组合模式(Composite)

适合场景:

  • 树形结构
  • 如文件夹/文件、菜单/子菜单、组织架构

关键词:

  • 部分—整体
  • 树形结构统一处理

记忆点:

  • 叶子节点和容器节点统一对待

  1. 装饰器模式(Decorator)

适合场景:

  • 动态给对象增加功能,不想修改原类
  • 如 I/O 流加缓冲、加加密、加日志
  • 给组件附加权限校验、统计功能

关键词:

  • 动态增强
  • 比继承更灵活

记忆点:

  • 与代理模式容易混淆
  • 装饰器强调“增强功能”

  1. 外观模式(Facade)

适合场景:

  • 子系统复杂,希望对外提供统一简单入口
  • 如一键启动流程、统一服务入口、SDK 封装

关键词:

  • 简化调用
  • 统一入口

记忆点:

  • 核心是“隐藏子系统复杂性”

  1. 享元模式(Flyweight)

适合场景:

  • 系统中有大量细粒度对象,内存占用大
  • 如字符对象、棋子对象、图标对象

关键词:

  • 共享对象
  • 节省内存

记忆点:

  • 区分内部状态与外部状态

  1. 代理模式(Proxy)

适合场景:

  • 需要控制对对象的访问
  • 如远程代理、虚代理、权限代理、缓存代理

关键词:

  • 控制访问
  • 间接访问真实对象

记忆点:

  • 与装饰器区分:
    • 代理:控制访问
    • 装饰器:增强功能

(三)行为型模式:解决“对象之间怎么协作”

  1. 策略模式(Strategy)

适合场景:

  • 有多种算法或业务规则可互换
  • 如支付策略、折扣策略、排序策略、路由策略

关键词:

  • 算法封装
  • 可互换

记忆点:

  • “同一问题,多种算法可切换”就是策略

  1. 模板方法模式(Template Method)

适合场景:

  • 流程固定,但某些步骤实现不同
  • 如报表生成流程、数据导入流程、考试流程

关键词:

  • 定义算法骨架
  • 子类重写具体步骤

记忆点:

  • “整体流程不变,细节步骤可变”就是模板方法

  1. 观察者模式(Observer)

适合场景:

  • 一个对象状态变化,要通知多个对象
  • 如事件监听、消息订阅、UI 联动、发布订阅

关键词:

  • 一对多通知
  • 发布—订阅

记忆点:

  • 题干出现“通知多个依赖对象”基本就是观察者

  1. 责任链模式(Chain of Responsibility)

适合场景:

  • 多个对象都可能处理同一个请求,谁处理运行时决定
  • 如审批流程、过滤器链、异常处理链

关键词:

  • 请求沿链传递
  • 解耦发送者和接收者

记忆点:

  • 常见于工作流、过滤器、权限校验链

  1. 命令模式(Command)

适合场景:

  • 需要把请求封装成对象
  • 支持撤销/重做、请求队列、日志记录
  • 如菜单操作、遥控器、事务操作

关键词:

  • 请求对象化
  • 支持撤销、排队

记忆点:

  • “请求发送者与执行者解耦”是命令模式核心

  1. 状态模式(State)

适合场景:

  • 对象在不同状态下行为不同
  • 如订单状态、工作流状态、播放器状态、TCP 连接状态

关键词:

  • 状态变化引起行为变化
  • 消除大量 if-else

记忆点:

  • 与策略模式易混淆
  • 策略:主动切换算法
  • 状态:状态变化驱动行为变化

  1. 迭代器模式(Iterator)

适合场景:

  • 顺序访问聚合对象中的元素,而不暴露内部结构
  • 如遍历集合、列表、树结构

关键词:

  • 统一遍历接口
  • 隐藏内部结构

记忆点:

  • 主要用于集合遍历

  1. 中介者模式(Mediator)

适合场景:

  • 多个对象之间交互复杂,网状依赖严重
  • 如聊天系统、界面控件协作、航班调度

关键词:

  • 集中协调
  • 降低对象间耦合

记忆点:

  • “对象间不直接通信,都通过中间者协调”

  1. 备忘录模式(Memento)

适合场景:

  • 需要保存对象历史状态,以便恢复
  • 如撤销、回滚、存档点

关键词:

  • 状态快照
  • 恢复历史状态

记忆点:

  • 常和命令模式一起出现

  1. 访问者模式(Visitor)

适合场景:

  • 数据结构相对稳定,但对其进行的操作经常变化
  • 如编译器语法树处理、报表统计、对象结构分析

关键词:

  • 操作与数据结构分离
  • 易于新增操作

记忆点:

  • “结构稳定、操作多变”是判断关键

  1. 解释器模式(Interpreter)

适合场景:

  • 需要定义语法规则并解释执行
  • 如表达式计算、规则引擎、简单脚本解析

关键词:

  • 语法解释
  • 表达式求值

记忆点:

  • 适合简单语言或规则系统,不适合特别复杂语法

三、软考最常考的几个区分

  1. 工厂方法 vs 抽象工厂
  • 工厂方法:创建一种产品
  • 抽象工厂:创建一族产品

  1. 装饰器 vs 代理
  • 装饰器:增强功能
  • 代理:控制访问

  1. 策略 vs 状态
  • 策略:多种算法任选其一
  • 状态:对象状态改变导致行为变化

  1. 模板方法 vs 策略
  • 模板方法:流程骨架固定,细节延迟到子类
  • 策略:算法整体可替换

  1. 适配器 vs 桥接
  • 适配器:解决现有接口不兼容
  • 桥接:解决两个维度独立变化