设计模式分类:创建型、结构型与行为型
设计模式是面向对象设计中反复出现的问题的解决方案,根据其解决问题的侧重点,可分为三大类:创建型模式、结构型模式和行为型模式。每类模式聚焦于软件设计的不同层面,共同助力构建灵活、可复用的系统。
创建型模式(Creational Patterns)
核心目标
抽象对象的实例化过程,封装对象创建的细节,使系统在不依赖具体类的情况下创建对象,从而提高灵活性和可扩展性。
主要解决问题
- 如何隐藏对象创建的复杂性(如初始化步骤、依赖管理)?
- 如何确保对象创建符合特定约束(如单例、池化)?
- 如何使系统独立于对象的具体类型,便于替换或扩展?
包含模式(5 种)
- 工厂方法模式(Factory Method)
- 定义一个创建对象的接口,由子类决定实例化哪个类。
- 类模式(通过继承实现),典型应用:
Java Collection的iterator()方法。
- 抽象工厂模式(Abstract Factory)
- 提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。
- 示例:不同操作系统的 UI 组件工厂(Windows 按钮与 Mac 按钮)。
- 单例模式(Singleton)
- 确保一个类仅有一个实例,并提供全局访问点。
- 应用:配置管理器、线程池等需唯一实例的场景。
- 建造者模式(Builder)
- 将复杂对象的构建过程与表示分离,使同一构建过程可创建不同表示。
- 示例:
StringBuilder(分步构建字符串)、复杂对象的配置器。
- 原型模式(Prototype)
- 通过复制现有对象(原型)来创建新对象,避免重复初始化。
- 应用:大对象的高效复制(如克隆数据库连接对象)。
结构型模式(Structural Patterns)
核心目标
描述类与对象的组合方式,通过灵活的组合实现更复杂的功能结构,同时保持结构的稳定性和可扩展性。
主要解决问题
- 如何将简单对象组合成复杂结构(如树形结构、分层结构)?
- 如何在不修改现有代码的情况下,为对象添加新功能?
- 如何解决接口不兼容的问题,使不同组件协同工作?
包含模式(7 种)
- 适配器模式(Adapter)
- 将一个类的接口转换成客户端期望的另一个接口,使不兼容的类可以协同工作。
- 类模式(类适配器,通过继承)和对象模式(对象适配器,通过组合),示例:Java 的
InputStreamReader(字节流→字符流适配)。
- 桥接模式(Bridge)
- 将抽象部分与实现部分分离,使两者可以独立变化。
- 示例:图形界面中 “形状”(抽象)与 “绘制方式”(实现)的分离。
- 组合模式(Composite)
- 将对象组合成树形结构,以表示 “部分 - 整体” 关系,使客户端对单个对象和组合对象的处理一致。
- 示例:文件系统(文件与文件夹的统一操作)。
- 装饰模式(Decorator)
- 动态地给对象添加额外职责,无需修改原类。
- 示例:Java 的
BufferedInputStream(为输入流添加缓冲功能)。
- 外观模式(Facade)
- 为子系统中的一组接口提供一个统一的高层接口,简化客户端与子系统的交互。
- 示例:操作系统的 API(封装底层硬件交互细节)。
- 享元模式(Flyweight)
- 通过共享技术减少创建对象的数量,节省内存。
- 应用:字符常量池(
String.intern())、围棋棋子(共享相同颜色的棋子对象)。
- 代理模式(Proxy)
- 为其他对象提供一种代理以控制对该对象的访问(如延迟加载、权限控制)。
- 示例:远程代理(RPC)、虚拟代理(图片懒加载)。
行为型模式(Behavioral Patterns)
核心目标
描述对象间的交互方式和职责分配,优化算法流程和对象协作,使系统行为更灵活、可复用。
主要解决问题
- 如何在对象间分配职责,避免耦合过紧?
- 如何处理对象间的复杂通信(如事件通知、命令传递)?
- 如何封装算法变化,使客户端可以灵活切换策略?
包含模式(11 种)
- 模板方法模式(Template Method)
- 定义一个算法的骨架,将步骤延迟到子类实现。
- 类模式(通过继承),示例:
JUnit的setUp()和tearDown()方法。
- 命令模式(Command)
- 将请求封装为对象,使客户端可以参数化不同的请求、队列或日志请求。
- 示例:遥控器按钮(每个按钮对应一个命令对象)。
- 迭代器模式(Iterator)
- 提供一种方法顺序访问聚合对象中的元素,而无需暴露其内部结构。
- 示例:Java 的
Iterator接口(遍历集合)。
- 观察者模式(Observer)
- 定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者自动收到通知。
- 应用:事件监听(如 GUI 按钮点击事件)、发布 - 订阅系统。
- 策略模式(Strategy)
- 定义一系列算法,将每个算法封装起来,并使它们可互换。
- 示例:排序算法(冒泡、快速排序可动态切换)。
- 职责链模式(Chain of Responsibility)
- 为请求创建一个接收者对象的链,使每个接收者都有机会处理请求。
- 示例:日志系统(不同级别日志由不同处理器处理)。
- 中介者模式(Mediator)
- 用一个中介对象封装一系列对象的交互,减少对象间的直接耦合。
- 示例:聊天室(中介者转发消息,用户无需直接交互)。
- 备忘录模式(Memento)
- 在不破坏封装的前提下,捕获对象的内部状态,并在需要时恢复。
- 应用:文本编辑器的撤销功能。
- 状态模式(State)
- 允许对象在内部状态改变时改变其行为,使对象看起来好像修改了它的类。
- 示例:订单状态流转(待支付→已支付→已发货)。
- 访问者模式(Visitor)
- 表示一个作用于某对象结构中的各元素的操作,使可以在不改变元素类的前提下定义新操作。
- 示例:数据结构的多维度遍历(如同时计算树的深度和节点数)。
- 解释器模式(Interpreter)
- 给定一个语言,定义它的文法表示,并定义一个解释器来解释该语言的句子。
- 类模式(通过继承),应用:表达式解析器(如数学公式计算)。
类模式与对象模式的区别
- 类模式:通过继承实现,强调类之间的静态关系(编译期确定)。
仅 4 种:工厂方法模式、适配器模式(类适配器)、模板方法模式、解释器模式。 - 对象模式:通过组合 / 聚合实现,强调对象间的动态关系(运行期可调整)。
其余 21 种均为对象模式,更灵活,是设计模式的主流。
总结
三大类设计模式从不同维度解决软件设计问题:
- 创建型:控制对象创建,解耦创建与使用;
- 结构型:优化类 / 对象组合,构建灵活结构;
- 行为型:规范对象交互,分配职责与算法
v1.3.10