准备软件设计师时,设计模式最容易卡在“名字都听过,但题目一换说法就认不出来”。这篇笔记不从复杂 UML 讲起,而是先把 23 种经典模式放回三个问题里:对象怎么创建、对象怎么组合、对象怎么协作。

这篇速查主要记录

  • 23种模式的三大分类和一句话理解
  • 工厂、单例、生成器、适配器等高频模式
  • 考试中最容易混淆的模式对比
  • 如何从题干关键词和UML角色快速判断

一、先按三类建立地图

分类它在解决什么问题包含的模式
创建型对象怎么创建、什么时候创建工厂方法、抽象工厂、单例、生成器、原型
结构型类和对象怎么组合成更大的结构适配器、桥接、组合、装饰器、外观、享元、代理
行为型对象之间怎么分工、通信和协作责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者

二、创建型:对象怎么创建

模式大白话考试关键词最该记住的点
工厂方法子类决定创建哪一种产品。抽象工厂、具体工厂、延迟实例化一个具体工厂通常对应一种具体产品。
抽象工厂一个工厂生产一整套配套产品。产品族、相关对象、风格一致新增产品族容易,新增产品种类困难。
单例一个类全局只允许有一个实例。私有构造、静态实例、getInstance适合配置、日志、缓存、连接池;要注意线程安全。
生成器复杂对象分步骤组装,最后 build。Builder、Director、逐步构建解决构造方法参数太多、可选项太多的问题。
原型复制已有对象,避免重新走复杂创建流程。clone、浅拷贝、深拷贝重点看引用属性是否也被复制。
工厂方法造一个,抽象工厂造一族;单例只一个,生成器分步造;原型靠复制。

三、结构型:对象怎么组合

模式大白话典型场景
适配器两个接口对不上,套一个转换器。旧系统兼容新接口、第三方库适配。
桥接把抽象和实现拆开,让两个维度独立变化。图形×颜色、消息类型×发送渠道。
组合单个对象和一组对象,用同一种方式处理。文件/文件夹、菜单/子菜单、组织树。
装饰器不改原类,给对象一层层增加功能。输入流包装、咖啡加配料、日志增强。
外观复杂子系统对外只提供一个简单入口。电脑启动、订单系统统一入口。
享元相同对象不要创建很多份,大家共享。大量树木、字符、图标、对象缓存。
代理真实对象前面加一层,控制访问。权限代理、远程代理、虚拟代理、缓存代理。

四、行为型:对象怎么协作

模式大白话典型关键词
责任链请求沿处理者链逐个传,直到有人处理。请假审批、异常处理、过滤器链。
命令把“做某件事”封装成一个对象。调用者、命令、接收者、撤销重做。
解释器给表达式或小语言定义规则并解释执行。文法、表达式、解析。
迭代器不暴露集合内部结构,统一遍历元素。集合、遍历、hasNext、next。
中介者对象之间不直接互聊,统一通过中介协调。中央协调、聊天室、降低耦合。
备忘录保存一份快照,以后可以恢复。撤销、存档、回滚。
观察者一个对象变化,自动通知所有关注者。一对多、发布订阅、事件监听。
状态对象处于不同状态时,表现出不同的行为。状态切换、订单、连接、游戏角色。
策略一组算法可以互换,运行时选择一种。算法替换、支付方式、排序方式。
模板方法父类固定大流程,子类实现小步骤。算法骨架、固定流程、钩子。
访问者对象结构不变,新增操作单独实现。双重分派、操作分离、结构稳定。

五、最容易混淆的几组模式

对比一句话区分做题时问自己
适配器 vs 装饰器适配器改接口,装饰器加功能。原对象功能不变但接口不兼容?适配器。想动态叠加能力?装饰器。
装饰器 vs 代理装饰器增强功能,代理控制访问。重点是增加行为?装饰器。重点是权限、远程、延迟、缓存?代理。
工厂方法 vs 抽象工厂工厂方法造一个,抽象工厂造一族。一个产品的多个实现?工厂方法。多个配套产品?抽象工厂。
策略 vs 状态策略由客户端选,状态由对象当前状态决定。主动选择算法?策略。状态变化导致行为变化?状态。
观察者 vs 中介者观察者是一对多通知,中介者负责多对象协调。主题通知订阅者?观察者。对象交互复杂?中介者。
模板方法 vs 策略模板方法靠继承固定流程,策略靠组合替换算法。流程骨架固定、子类补步骤?模板方法。多套算法可替换?策略。

六、从UML图快速识别

七、最后的做题顺序

  1. 先看分类:题目描述的是创建、组合,还是协作?
  2. 再找变化点:变化的是接口、功能、访问方式、算法、状态,还是流程?
  3. 再看角色:有没有工厂、产品族、观察者、策略、接收者、代理等关键词?
  4. 最后排除:确认它不是在解决另一个相似问题。
创建型看“怎么造”,结构型看“怎么拼”,行为型看“怎么协作”。这句话是设计模式选择题的总开关。