[L1] 设计模式的三大分类与意图
一句话结论
GoF 将 23 种模式按意图分为创建型、结构型、行为型,分别解决对象创建、组合与职责协作问题。
体系讲解
三大分类对照表
| 分类 | 核心意图 | 模式数 | 典型代表 |
|---|---|---|---|
| 创建型(Creational) | 将对象的创建与使用解耦,隐藏实例化细节 | 5 | 单例、工厂方法、抽象工厂、建造者、原型 |
| 结构型(Structural) | 通过组合/封装灵活地拼装类与对象 | 7 | 适配器、装饰器、代理、门面、桥接、组合、享元 |
| 行为型(Behavioral) | 定义对象间的职责分配与协作算法 | 11 | 策略、观察者、模板方法、责任链、命令、状态… |
OOP 三大特性与模式的对应关系
- 封装 → 创建型:工厂方法、建造者隐藏构造细节,调用方无需感知具体类
- 继承 / 多态 → 行为型:策略、模板方法通过多态在运行时替换算法
- 组合 → 结构型:装饰器、代理以"包裹"方式组合对象,优于硬继承
模式解决复杂度的三条主线
- 解耦:观察者让发布者不依赖订阅者具体类;门面降低子系统与调用层耦合
- 扩展:装饰器、策略在不改动核心逻辑的前提下增加新行为
- 复用:模板方法抽取公共骨架;享元共享细粒度对象
快速选型依据
需要控制实例化 → 创建型
需要灵活组装类/对象关系 → 结构型
需要定义协作方式/算法替换 → 行为型
考察意图
考查候选人对设计模式的全局视角:能否用三大分类快速定位一个模式所属域;区分"只能背名称"与"真正理解设计意图"的候选人。
追问链
三大分类各举一个你在项目中实际用过的模式,说明为什么选它?
简答:如创建型用工厂方法隔离 DB 驱动创建、结构型用装饰器叠加日志/缓存、行为型用策略替换支付渠道——重点说清"用它解决了什么问题"。"优先组合而非继承"对应哪类模式?为什么?
简答:对应结构型。继承是编译期静态耦合,子类依赖父类实现;组合可在运行时替换被包裹对象,装饰器和代理都是典型例子。行为型模式最多(11 种),它们的共同点是什么?
简答:都在描述"多个对象如何分配职责/协作",本质是对控制流或算法的封装与解耦,区别在于协作拓扑(1:1 命令、1:N 观察者、链式责任链等)。"代理"属于哪类?很多人会答错,为什么?
简答:代理是结构型,因其意图是控制访问方式(组装关系),而非定义行为协作逻辑;行为型的核心是"算法/职责分配",与此不同。
易错点
- 将代理模式归入行为型:代理的意图是"控制对一个对象的访问",属结构型;行为型关注的是职责协作而非访问控制。
- 混淆工厂方法与抽象工厂:工厂方法由子类决定创建单一产品,抽象工厂创建相关联的一族产品(多个产品维度)。
- 认为模式越多越好:模式本身是解决特定上下文问题的方案,过度设计反而增加复杂度;GoF 原书强调"何时使用"和"何时不用"。
代码示例
本题无需代码。