GoF 模式是什么
《设计模式》一书归纳了 23 种经典模式,分为创建型、结构型与行为型三类,解决对象创建、组合与交互中的常见变化点。它们是团队间的交流词汇与重构目标,不是必须套用的清单。引入模式前应先确认存在对应的变化点:没有变化点而套用模式,只会增加间接层与理解成本。
分类
| 分类 | 数量 | 代表模式 |
|---|---|---|
| 创建型 | 5 | 工厂方法、抽象工厂、建造者、原型、单例 |
| 结构型 | 7 | 适配器、桥接、组合、装饰器、外观、享元、代理 |
| 行为型 | 11 | 策略、观察者、命令、状态、模板方法、责任链、访问者等 |
基本信息
| 适用平台 | 语言无关,面向对象语言均有对应实现 |
|---|---|
| 核心价值 | 提供共同词汇、指向可复用的结构与取舍经验 |
| 引入前提 | 先确认变化点与扩展方向,再选择模式 |
| 现代替代 | 部分模式已被语言特性吸收,如函数式一等函数替代策略类 |
| 常见替代 | 依赖注入管理生命周期,弱化单例模式的作用 |
典型使用场景
- 多种支付渠道:用策略模式封装差异,调用方不写分支判断
- 第三方对接:用适配器隔离外部 SDK,便于替换与测试
- 对象创建复杂:用建造者组织多参数构造,避免长参数列表
- 请求链处理:用责任链处理审批、风控等逐级判定
- 跨层通知:用观察者解耦变更发布与订阅处理
- 遗留代码重构:用模式词汇描述现存结构,明确改进方向
常见误用
| 模式 | 误用表现 | 更合适的做法 |
|---|---|---|
| 单例 | 到处全局访问,测试困难 | 依赖注入统一管理生命周期 |
| 工厂方法 | 为唯一实现预建工厂 | 直接在组合根构造对象 |
| 装饰器 | 层层包裹后堆栈难以阅读 | 控制包裹层数,保留日志说明 |
| 访问者 | 数据结构稳定但行为频繁变化却未评估 | 先确认变化维度是否匹配 |
| 抽象工厂 | 同一产品族只有一个实现 | 简化为普通构造逻辑 |
模式是重构的结果而不是起点:先写出清晰直接的代码,在变化点真的出现时再做形态调整,比预先铺满模式更容易维护。
单例在并发与测试中问题较多,现代实践更倾向用依赖注入管理对象生命周期。