在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了 23 种设计模式。这些模式可以从两个维度进行分类:根据目的和根据作用范围。本文将详细探讨这两种分类方式,并逐一介绍每种模式的功能和应用场景。
1. 根据目的分类
根据设计模式的目的,GoF 将 23 种模式分为三大类:创建型模式、结构型模式和行为型模式。
1.1 创建型模式(Creational Patterns)
- 目的:关注对象的创建过程,旨在将对象的创建与使用分离。
- 模式:
- 单例模式(Singleton)
- 功能:确保一个类只有一个实例,并提供全局访问点。
- 应用场景:数据库连接池、日志管理器。
- 工厂方法模式(Factory Method)
- 功能:定义一个创建对象的接口,由子类决定实例化哪个类。
- 应用场景:框架中的对象创建,如 Spring 的 Bean 工厂。
- 抽象工厂模式(Abstract Factory)
- 功能:提供一个接口,用于创建相关或依赖对象的家族。
- 应用场景:跨平台 UI 组件库。
- 建造者模式(Builder)
- 功能:将复杂对象的构建与其表示分离。
- 应用场景:构建复杂对象,如 HTML 文档。
- 原型模式(Prototype)
- 功能:通过复制现有对象来创建新对象。
- 应用场景:游戏中的角色复制。
- 单例模式(Singleton)
1.2 结构型模式(Structural Patterns)
-
目的:关注类和对象的组合,旨在形成更大的结构。
-
模式:
- 适配器模式(Adapter)
- 功能:将一个类的接口转换成客户端期望的另一个接口。
- 应用场景:整合不兼容的接口。
- 装饰器模式(Decorator)
- 功能:动态地为对象添加额外的职责。
- 应用场景:Java I/O 流。
- 代理模式(Proxy)
- 功能:为其他对象提供一个代理,以控制对其访问。
- 应用场景:延迟加载、权限控制。
- 组合模式(Composite)
- 功能:将对象组合成树形结构以表示“部分-整体”关系。
- 应用场景:文件系统、UI 组件树。
- 桥接模式(Bridge)
- 功能:将抽象部分与实现部分分离。
- 应用场景:多维度变化的系统,如不同形状和颜色的图形。
- 外观模式(Facade)
- 功能:为子系统中的一组接口提供一个统一的接口。
- 应用场景:简化复杂系统的调用。
- 享元模式(Flyweight)
- 功能:通过共享技术有效地支持大量细粒度对象。
- 应用场景:文本编辑器中的字符对象。
- 适配器模式(Adapter)
1.3 行为型模式(Behavioral Patterns)
-
目的:关注对象之间的职责分配和通信方式。
-
模式:
- 观察者模式(Observer)
- 功能:定义对象间的一对多依赖关系。
- 应用场景:事件驱动系统,如 GUI 框架中的事件监听。
- 策略模式(Strategy)
- 功能:定义一系列算法,使它们可以互相替换。
- 应用场景:多种算法或策略的场景,如排序算法。
- 命令模式(Command)
- 功能:将请求封装为对象。
- 应用场景:撤销操作、任务队列。
- 状态模式(State)
- 功能:允许对象在其内部状态改变时改变其行为。
- 应用场景:状态机、游戏角色的行为变化。
- 模板方法模式(Template Method)
- 功能:定义一个算法的骨架,将某些步骤延迟到子类中实现。
- 应用场景:框架中的钩子方法。
- 迭代器模式(Iterator)
- 功能:提供一种方法顺序访问一个聚合对象中的各个元素。
- 应用场景:集合类的遍历。
- 责任链模式(Chain of Responsibility)
- 功能:将请求的发送者和接收者解耦。
- 应用场景:审批流程、异常处理链。
- 访问者模式(Visitor)
- 功能:将算法与对象结构分离。
- 应用场景:编译器中的语法树遍历。
- 中介者模式(Mediator)
- 功能:定义一个中介对象来封装一系列对象之间的交互。
- 应用场景:聊天室、事件总线。
- 备忘录模式(Memento)
- 功能:捕获并外部化一个对象的内部状态。
- 应用场景:撤销操作、游戏存档。
- 解释器模式(Interpreter)
- 功能:定义一个语言的文法,并定义一个解释器来解释该语言中的句子。
- 应用场景:编译器、规则引擎。
- 观察者模式(Observer)
2. 根据作用范围分类
根据设计模式的作用范围,GoF 将 23 种模式分为两大类:类模式和对象模式。
2.1 类模式(Class Patterns)
- 作用范围:关注类与子类之间的关系,主要通过继承实现。
- 模式:
- 工厂方法模式(Factory Method)
- 适配器模式(Adapter,类适配器)
- 模板方法模式(Template Method)
- 解释器模式(Interpreter)
2.2 对象模式(Object Patterns)
- 作用范围:关注对象之间的关系,主要通过组合实现。
- 模式:
- 单例模式(Singleton)
- 抽象工厂模式(Abstract Factory)
- 建造者模式(Builder)
- 原型模式(Prototype)
- 适配器模式(Adapter,对象适配器)
- 装饰器模式(Decorator)
- 代理模式(Proxy)
- 组合模式(Composite)
- 桥接模式(Bridge)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 观察者模式(Observer)
- 策略模式(Strategy)
- 命令模式(Command)
- 状态模式(State)
- 迭代器模式(Iterator)
- 责任链模式(Chain of Responsibility)
- 访问者模式(Visitor)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
表 1 介绍了这 23 种设计模式的分类:
范围目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法 | (类)适配器 | 模板方法、解释器 |
对象模式 | 单例 原型 抽象工厂 建造者 | 代理 (对象)适配器 桥接 装饰 外观 享元 组合 | 策略 命令 职责链 状态 观察者 中介者 迭代器 访问者 备忘录 |
总结
GoF 的 23 种设计模式从不同角度解决了软件设计中的常见问题。通过根据目的和根据作用范围两种分类方式,我们可以更清晰地理解这些模式的核心思想及其适用场景。无论是创建型、结构型还是行为型模式,亦或是类模式和对象模式,它们都为开发人员提供了强大的工具箱,帮助构建灵活、可维护和可扩展的软件系统。