是什么

设计模式是对常见设计问题的可复用的解决方案模板。

1994 年,GoF(Gang of Four)的《设计模式》一书整理了 23 种经典模式,分为三类:

  • 创建型:单例、工厂、抽象工厂、建造者、原型;
  • 结构型:适配器、装饰器、代理、外观、桥接、组合、享元;
  • 行为型:策略、观察者、命令、模板方法、迭代器、状态、责任链、访问者、中介者、备忘录、解释器。

价值

一、共享词汇

"这里用个策略模式"——一句话传达了整个设计结构。这是模式最大的实用价值:沟通效率。

二、已被验证的方案

模式是很多人踩过坑后总结的,能帮你避免一些常见的设计错误。

三、代码可读性

熟悉模式的开发者能更快理解代码结构。

风险:过度使用

"模式病"(Patternitis):为了用模式而用模式,把简单的问题复杂化。

典型表现:

  • 一个只有一种行为的地方,非要套策略模式 + 工厂;
  • 层层抽象,但每层都只有一个实现;
  • 代码里到处是 XxxFactory、XxxStrategy、XxxBuilder,但业务价值没变。

代价:代码量增加、理解成本提高、追踪调用链变困难。

一个简单的判断

先写直白的代码,等到"痛"了再引入模式。

比如:

  • 当 if-else 分支太多、且每种分支的行为差异大 → 考虑策略模式;
  • 当需要给对象动态添加功能,而继承会导致类爆炸 → 考虑装饰器模式;
  • 当一个模块需要通知多个"关心它的"对象 → 考虑观察者模式。

模式应该解决问题,而不是制造问题。

几个特别常用的

策略模式:把一组可互换的算法封装起来,运行时选择。替代大量的条件分支。

观察者模式:发布—订阅。一个对象状态变化时,通知所有订阅者。这是事件驱动和 MVC 的基础。

工厂模式:把对象的创建逻辑集中管理,调用方不需要知道具体类型。

装饰器模式:动态地给对象添加职责,而不改变其接口。比继承更灵活。

适配器模式:让不兼容的接口能够协作。在集成第三方库或遗留代码时常见。

单例模式:确保一个类只有一个实例。

注意:单例是争议最大的模式之一——它引入了全局状态,使代码难以测试(测试之间互相污染)。现代实践中通常建议用依赖注入替代单例。

语言的影响

有些模式在特定语言中变得不必要:

  • Java 的迭代器模式 → Python/JavaScript 的原生迭代协议;
  • 命令模式 → 函数式语言中的一等函数;
  • 模板方法 → 高阶函数或回调。

现代语言特性(泛型、闭包、模式匹配)让很多 GoF 模式变得平凡。

一个建议

学习模式的意图(解决什么问题),而不是死记结构。

当你遇到一个设计问题,能想起"好像有个模式是干这个的",然后去查——这比背诵 23 个模式的 UML 图更有价值。

说明:本文为软件设计的知识整理。