是什么
设计模式是对常见设计问题的可复用的解决方案模板。
1994 年,GoF(Gang of Four)的《设计模式》一书整理了 23 种经典模式,分为三类:
- 创建型:单例、工厂、抽象工厂、建造者、原型;
- 结构型:适配器、装饰器、代理、外观、桥接、组合、享元;
- 行为型:策略、观察者、命令、模板方法、迭代器、状态、责任链、访问者、中介者、备忘录、解释器。
价值
一、共享词汇
"这里用个策略模式"——一句话传达了整个设计结构。这是模式最大的实用价值:沟通效率。
二、已被验证的方案
模式是很多人踩过坑后总结的,能帮你避免一些常见的设计错误。
三、代码可读性
熟悉模式的开发者能更快理解代码结构。
风险:过度使用
"模式病"(Patternitis):为了用模式而用模式,把简单的问题复杂化。
典型表现:
- 一个只有一种行为的地方,非要套策略模式 + 工厂;
- 层层抽象,但每层都只有一个实现;
- 代码里到处是
XxxFactory、XxxStrategy、XxxBuilder,但业务价值没变。
代价:代码量增加、理解成本提高、追踪调用链变困难。
一个简单的判断
先写直白的代码,等到"痛"了再引入模式。
比如:
- 当 if-else 分支太多、且每种分支的行为差异大 → 考虑策略模式;
- 当需要给对象动态添加功能,而继承会导致类爆炸 → 考虑装饰器模式;
- 当一个模块需要通知多个"关心它的"对象 → 考虑观察者模式。
模式应该解决问题,而不是制造问题。
几个特别常用的
策略模式:把一组可互换的算法封装起来,运行时选择。替代大量的条件分支。
观察者模式:发布—订阅。一个对象状态变化时,通知所有订阅者。这是事件驱动和 MVC 的基础。
工厂模式:把对象的创建逻辑集中管理,调用方不需要知道具体类型。
装饰器模式:动态地给对象添加职责,而不改变其接口。比继承更灵活。
适配器模式:让不兼容的接口能够协作。在集成第三方库或遗留代码时常见。
单例模式:确保一个类只有一个实例。
注意:单例是争议最大的模式之一——它引入了全局状态,使代码难以测试(测试之间互相污染)。现代实践中通常建议用依赖注入替代单例。
语言的影响
有些模式在特定语言中变得不必要:
- Java 的迭代器模式 → Python/JavaScript 的原生迭代协议;
- 命令模式 → 函数式语言中的一等函数;
- 模板方法 → 高阶函数或回调。
现代语言特性(泛型、闭包、模式匹配)让很多 GoF 模式变得平凡。
一个建议
学习模式的意图(解决什么问题),而不是死记结构。
当你遇到一个设计问题,能想起"好像有个模式是干这个的",然后去查——这比背诵 23 个模式的 UML 图更有价值。
说明:本文为软件设计的知识整理。