0%

设计模式分类

设计模式分类:创建型、结构型与行为型

设计模式是面向对象设计中反复出现的问题的解决方案,根据其解决问题的侧重点,可分为三大类:创建型模式结构型模式行为型模式。每类模式聚焦于软件设计的不同层面,共同助力构建灵活、可复用的系统。

创建型模式(Creational Patterns)

核心目标

抽象对象的实例化过程,封装对象创建的细节,使系统在不依赖具体类的情况下创建对象,从而提高灵活性和可扩展性。

主要解决问题

  • 如何隐藏对象创建的复杂性(如初始化步骤、依赖管理)?
  • 如何确保对象创建符合特定约束(如单例、池化)?
  • 如何使系统独立于对象的具体类型,便于替换或扩展?

包含模式(5 种)

  1. 工厂方法模式(Factory Method)
    • 定义一个创建对象的接口,由子类决定实例化哪个类。
    • 类模式(通过继承实现),典型应用:Java Collectioniterator()方法。
  2. 抽象工厂模式(Abstract Factory)
    • 提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。
    • 示例:不同操作系统的 UI 组件工厂(Windows 按钮与 Mac 按钮)。
  3. 单例模式(Singleton)
    • 确保一个类仅有一个实例,并提供全局访问点。
    • 应用:配置管理器、线程池等需唯一实例的场景。
  4. 建造者模式(Builder)
    • 将复杂对象的构建过程与表示分离,使同一构建过程可创建不同表示。
    • 示例:StringBuilder(分步构建字符串)、复杂对象的配置器。
  5. 原型模式(Prototype)
    • 通过复制现有对象(原型)来创建新对象,避免重复初始化。
    • 应用:大对象的高效复制(如克隆数据库连接对象)。

结构型模式(Structural Patterns)

核心目标

描述类与对象的组合方式,通过灵活的组合实现更复杂的功能结构,同时保持结构的稳定性和可扩展性。

主要解决问题

  • 如何将简单对象组合成复杂结构(如树形结构、分层结构)?
  • 如何在不修改现有代码的情况下,为对象添加新功能?
  • 如何解决接口不兼容的问题,使不同组件协同工作?

包含模式(7 种)

  1. 适配器模式(Adapter)
    • 将一个类的接口转换成客户端期望的另一个接口,使不兼容的类可以协同工作。
    • 类模式(类适配器,通过继承)和对象模式(对象适配器,通过组合),示例:Java 的InputStreamReader(字节流→字符流适配)。
  2. 桥接模式(Bridge)
    • 将抽象部分与实现部分分离,使两者可以独立变化。
    • 示例:图形界面中 “形状”(抽象)与 “绘制方式”(实现)的分离。
  3. 组合模式(Composite)
    • 将对象组合成树形结构,以表示 “部分 - 整体” 关系,使客户端对单个对象和组合对象的处理一致。
    • 示例:文件系统(文件与文件夹的统一操作)。
  4. 装饰模式(Decorator)
    • 动态地给对象添加额外职责,无需修改原类。
    • 示例:Java 的BufferedInputStream(为输入流添加缓冲功能)。
  5. 外观模式(Facade)
    • 为子系统中的一组接口提供一个统一的高层接口,简化客户端与子系统的交互。
    • 示例:操作系统的 API(封装底层硬件交互细节)。
  6. 享元模式(Flyweight)
    • 通过共享技术减少创建对象的数量,节省内存。
    • 应用:字符常量池(String.intern())、围棋棋子(共享相同颜色的棋子对象)。
  7. 代理模式(Proxy)
    • 为其他对象提供一种代理以控制对该对象的访问(如延迟加载、权限控制)。
    • 示例:远程代理(RPC)、虚拟代理(图片懒加载)。

行为型模式(Behavioral Patterns)

核心目标

描述对象间的交互方式和职责分配,优化算法流程和对象协作,使系统行为更灵活、可复用。

主要解决问题

  • 如何在对象间分配职责,避免耦合过紧?
  • 如何处理对象间的复杂通信(如事件通知、命令传递)?
  • 如何封装算法变化,使客户端可以灵活切换策略?

包含模式(11 种)

  1. 模板方法模式(Template Method)
    • 定义一个算法的骨架,将步骤延迟到子类实现。
    • 类模式(通过继承),示例:JUnitsetUp()tearDown()方法。
  2. 命令模式(Command)
    • 将请求封装为对象,使客户端可以参数化不同的请求、队列或日志请求。
    • 示例:遥控器按钮(每个按钮对应一个命令对象)。
  3. 迭代器模式(Iterator)
    • 提供一种方法顺序访问聚合对象中的元素,而无需暴露其内部结构。
    • 示例:Java 的Iterator接口(遍历集合)。
  4. 观察者模式(Observer)
    • 定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者自动收到通知。
    • 应用:事件监听(如 GUI 按钮点击事件)、发布 - 订阅系统。
  5. 策略模式(Strategy)
    • 定义一系列算法,将每个算法封装起来,并使它们可互换。
    • 示例:排序算法(冒泡、快速排序可动态切换)。
  6. 职责链模式(Chain of Responsibility)
    • 为请求创建一个接收者对象的链,使每个接收者都有机会处理请求。
    • 示例:日志系统(不同级别日志由不同处理器处理)。
  7. 中介者模式(Mediator)
    • 用一个中介对象封装一系列对象的交互,减少对象间的直接耦合。
    • 示例:聊天室(中介者转发消息,用户无需直接交互)。
  8. 备忘录模式(Memento)
    • 在不破坏封装的前提下,捕获对象的内部状态,并在需要时恢复。
    • 应用:文本编辑器的撤销功能。
  9. 状态模式(State)
    • 允许对象在内部状态改变时改变其行为,使对象看起来好像修改了它的类。
    • 示例:订单状态流转(待支付→已支付→已发货)。
  10. 访问者模式(Visitor)
    • 表示一个作用于某对象结构中的各元素的操作,使可以在不改变元素类的前提下定义新操作。
    • 示例:数据结构的多维度遍历(如同时计算树的深度和节点数)。
  11. 解释器模式(Interpreter)
    • 给定一个语言,定义它的文法表示,并定义一个解释器来解释该语言的句子。
    • 类模式(通过继承),应用:表达式解析器(如数学公式计算)。

类模式与对象模式的区别

  • 类模式:通过继承实现,强调类之间的静态关系(编译期确定)。
    仅 4 种:工厂方法模式、适配器模式(类适配器)、模板方法模式、解释器模式。
  • 对象模式:通过组合 / 聚合实现,强调对象间的动态关系(运行期可调整)。
    其余 21 种均为对象模式,更灵活,是设计模式的主流。

总结

三大类设计模式从不同维度解决软件设计问题:

  • 创建型:控制对象创建,解耦创建与使用;
  • 结构型:优化类 / 对象组合,构建灵活结构;
  • 行为型:规范对象交互,分配职责与算法

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10