2026.09.22 · 学习札记 · 约 12 分钟
软件设计师设计模式速查:23种模式一张地图
设计模式不是背代码,而是识别“变化点”:对象怎么创建、怎么组合、怎么协作。
准备软件设计师时,设计模式最容易卡在“名字都听过,但题目一换说法就认不出来”。这篇笔记不从复杂 UML 讲起,而是先把 23 种经典模式放回三个问题里:对象怎么创建、对象怎么组合、对象怎么协作。
这篇速查主要记录
- 23种模式的三大分类和一句话理解
- 工厂、单例、生成器、适配器等高频模式
- 考试中最容易混淆的模式对比
- 如何从题干关键词和UML角色快速判断
一、先按三类建立地图
| 分类 | 它在解决什么问题 | 包含的模式 |
| 创建型 | 对象怎么创建、什么时候创建 | 工厂方法、抽象工厂、单例、生成器、原型 |
| 结构型 | 类和对象怎么组合成更大的结构 | 适配器、桥接、组合、装饰器、外观、享元、代理 |
| 行为型 | 对象之间怎么分工、通信和协作 | 责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者 |
二、创建型:对象怎么创建
| 模式 | 大白话 | 考试关键词 | 最该记住的点 |
| 工厂方法 | 子类决定创建哪一种产品。 | 抽象工厂、具体工厂、延迟实例化 | 一个具体工厂通常对应一种具体产品。 |
| 抽象工厂 | 一个工厂生产一整套配套产品。 | 产品族、相关对象、风格一致 | 新增产品族容易,新增产品种类困难。 |
| 单例 | 一个类全局只允许有一个实例。 | 私有构造、静态实例、getInstance | 适合配置、日志、缓存、连接池;要注意线程安全。 |
| 生成器 | 复杂对象分步骤组装,最后 build。 | Builder、Director、逐步构建 | 解决构造方法参数太多、可选项太多的问题。 |
| 原型 | 复制已有对象,避免重新走复杂创建流程。 | clone、浅拷贝、深拷贝 | 重点看引用属性是否也被复制。 |
工厂方法造一个,抽象工厂造一族;单例只一个,生成器分步造;原型靠复制。
三、结构型:对象怎么组合
| 模式 | 大白话 | 典型场景 |
| 适配器 | 两个接口对不上,套一个转换器。 | 旧系统兼容新接口、第三方库适配。 |
| 桥接 | 把抽象和实现拆开,让两个维度独立变化。 | 图形×颜色、消息类型×发送渠道。 |
| 组合 | 单个对象和一组对象,用同一种方式处理。 | 文件/文件夹、菜单/子菜单、组织树。 |
| 装饰器 | 不改原类,给对象一层层增加功能。 | 输入流包装、咖啡加配料、日志增强。 |
| 外观 | 复杂子系统对外只提供一个简单入口。 | 电脑启动、订单系统统一入口。 |
| 享元 | 相同对象不要创建很多份,大家共享。 | 大量树木、字符、图标、对象缓存。 |
| 代理 | 真实对象前面加一层,控制访问。 | 权限代理、远程代理、虚拟代理、缓存代理。 |
四、行为型:对象怎么协作
| 模式 | 大白话 | 典型关键词 |
| 责任链 | 请求沿处理者链逐个传,直到有人处理。 | 请假审批、异常处理、过滤器链。 |
| 命令 | 把“做某件事”封装成一个对象。 | 调用者、命令、接收者、撤销重做。 |
| 解释器 | 给表达式或小语言定义规则并解释执行。 | 文法、表达式、解析。 |
| 迭代器 | 不暴露集合内部结构,统一遍历元素。 | 集合、遍历、hasNext、next。 |
| 中介者 | 对象之间不直接互聊,统一通过中介协调。 | 中央协调、聊天室、降低耦合。 |
| 备忘录 | 保存一份快照,以后可以恢复。 | 撤销、存档、回滚。 |
| 观察者 | 一个对象变化,自动通知所有关注者。 | 一对多、发布订阅、事件监听。 |
| 状态 | 对象处于不同状态时,表现出不同的行为。 | 状态切换、订单、连接、游戏角色。 |
| 策略 | 一组算法可以互换,运行时选择一种。 | 算法替换、支付方式、排序方式。 |
| 模板方法 | 父类固定大流程,子类实现小步骤。 | 算法骨架、固定流程、钩子。 |
| 访问者 | 对象结构不变,新增操作单独实现。 | 双重分派、操作分离、结构稳定。 |
五、最容易混淆的几组模式
| 对比 | 一句话区分 | 做题时问自己 |
| 适配器 vs 装饰器 | 适配器改接口,装饰器加功能。 | 原对象功能不变但接口不兼容?适配器。想动态叠加能力?装饰器。 |
| 装饰器 vs 代理 | 装饰器增强功能,代理控制访问。 | 重点是增加行为?装饰器。重点是权限、远程、延迟、缓存?代理。 |
| 工厂方法 vs 抽象工厂 | 工厂方法造一个,抽象工厂造一族。 | 一个产品的多个实现?工厂方法。多个配套产品?抽象工厂。 |
| 策略 vs 状态 | 策略由客户端选,状态由对象当前状态决定。 | 主动选择算法?策略。状态变化导致行为变化?状态。 |
| 观察者 vs 中介者 | 观察者是一对多通知,中介者负责多对象协调。 | 主题通知订阅者?观察者。对象交互复杂?中介者。 |
| 模板方法 vs 策略 | 模板方法靠继承固定流程,策略靠组合替换算法。 | 流程骨架固定、子类补步骤?模板方法。多套算法可替换?策略。 |
六、从UML图快速识别
- 私有构造方法 + 静态实例 + getInstance:单例。
- 抽象工厂 + 多个具体工厂,每个工厂创建一种产品:工厂方法。
- 一个工厂接口包含多个 createXXX 方法,各工厂生产一套产品:抽象工厂。
- Builder + Director + Product + 多个构建步骤:生成器。
- 目标接口 + 适配器 + 被适配者:适配器。
- Component 与 Composite 形成递归树形结构:组合。
- Subject 持有多个 Observer 并负责通知:观察者。
- Context 持有 Strategy,算法可以替换:策略。
七、最后的做题顺序
- 先看分类:题目描述的是创建、组合,还是协作?
- 再找变化点:变化的是接口、功能、访问方式、算法、状态,还是流程?
- 再看角色:有没有工厂、产品族、观察者、策略、接收者、代理等关键词?
- 最后排除:确认它不是在解决另一个相似问题。
创建型看“怎么造”,结构型看“怎么拼”,行为型看“怎么协作”。这句话是设计模式选择题的总开关。