设计模式之三大分类

292 阅读7分钟

设计模式的三种分类详解:创建型、结构型和行为型

设计模式是软件开发中被反复使用的、经过验证的解决方案。根据它们解决问题的不同方面,设计模式通常分为三类:创建型模式、结构型模式和行为型模式。本文将详细探讨这三种设计模式的分类及其常见模式。

一、创建型模式(Creational Patterns)单工抽建原)

创建型模式主要关注对象的创建过程,它们通过隐藏创建逻辑,使得系统独立于对象的创建、组合和表示。创建型模式帮助我们在创建对象时更加灵活和简洁。

常见的创建型模式:

  1. 单例模式(Singleton)

    • 目的:确保一个类只有一个实例,并提供一个全局访问点。
    • 示例:数据库连接管理器,每个应用程序只需要一个连接实例。
  2. 工厂方法模式(Factory Method)

    • 目的:定义一个用于创建对象的接口,但由子类决定实例化哪一个类。
    • 示例:日志记录器,根据不同的日志级别(如info、warn、error)创建不同的日志对象。
  3. 抽象工厂模式(Abstract Factory)

    • 目的:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
    • 示例:UI控件库,创建一组相关的UI组件(如按钮、文本框),而无需指定具体的组件类。
  4. 建造者模式(Builder)

    • 目的:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
    • 示例:创建一个包含多个部分的复杂对象,如汽车装配线,每个部分(如引擎、轮子)可以独立构建和组合。
  5. 原型模式(Prototype)

    • 目的:通过复制现有的实例来创建新的对象,而不是通过实例化类。
    • 示例:克隆一棵树,新的树具有原始树的所有属性,但在内存中是独立的对象。

二、结构型模式(Structural Patterns)适配桥,组合装,外观享元代

结构型模式关注类和对象的组合,它们通过识别关系来实现组合对象,确保这些组合在系统中更加灵活和高效。

常见的结构型模式:

  1. 适配器模式(Adapter)

    • 目的:将一个类的接口转换成客户端希望的另一个接口,使得原本不兼容的接口可以协同工作。
    • 示例:电源适配器,将110V电压转换为220V电压。
  2. 桥接模式(Bridge)

    • 目的:将抽象部分与实现部分分离,使它们可以独立变化。
    • 示例:图形绘制系统,分离图形的形状(如圆形、方形)和颜色(如红色、蓝色),使得它们可以独立变化和组合。
  3. 组合模式(Composite)

    • 目的:将对象组合成树形结构以表示部分-整体的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
    • 示例:文件系统,文件和文件夹可以统一处理,文件夹可以包含文件和其他文件夹。
  4. 装饰器模式(Decorator)

    • 目的:动态地给对象添加职责,而不改变其接口。
    • 示例:Java I/O流中的BufferedReader和BufferedWriter,通过装饰器模式增强基本的读取和写入功能。
  5. 外观模式(Facade)

    • 目的:为子系统中的一组接口提供一个一致的接口,使得子系统更易于使用。
    • 示例:复杂的图形绘制子系统,提供一个简化的接口以方便使用。
  6. 享元模式(Flyweight)

    • 目的:通过共享大量细粒度对象来节省内存。
    • 示例:字符对象池,在文本编辑器中,每个字符的实例被共享以节省内存。
  7. 代理模式(Proxy)

    • 目的:为另一个对象提供一个代理以控制对该对象的访问。
    • 示例:远程代理,控制对远程对象的访问。

三、行为型模式(Behavioral Patterns)责任命解释迭,中介备忘观察者,策略状态模板访"

行为型模式关注对象之间的责任分配和交互,它们通过描述对象如何协作来实现复杂的控制流和动态行为。

常见的行为型模式:

  1. 责任链模式(Chain of Responsibility)

    • 目的:为请求创建一个链式处理对象,沿着这条链传递请求,直到有一个对象处理它。
    • 示例:审批流程系统,每个审批节点是责任链的一部分。
  2. 命令模式(Command)

    • 目的:将请求封装为对象,以便使用不同的请求、队列或者日志来参数化其他对象。
    • 示例:事务处理系统,将操作封装为命令对象,以便进行撤销和重做。
  3. 解释器模式(Interpreter)

    • 目的:为语言创建解释器,并定义其语法表示和解释方法。
    • 示例:计算器程序,解析和计算数学表达式。
  4. 迭代器模式(Iterator)

    • 目的:提供一种方法来顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。
    • 示例:集合框架中的迭代器,遍历集合中的元素。
  5. 中介者模式(Mediator)

    • 目的:用一个中介对象来封装一组对象的交互,避免对象之间的直接通信。
    • 示例:聊天室系统,所有用户通过中介者(服务器)来发送和接收消息。
  6. 备忘录模式(Memento)

    • 目的:在不破坏封装的前提下,捕获并恢复对象的内部状态。
    • 示例:文本编辑器的撤销功能,保存和恢复文档的状态。
  7. 观察者模式(Observer)

    • 目的:定义对象间的一对多依赖关系,当一个对象的状态改变时,其相关依赖对象会收到通知并自动更新。
    • 示例:新闻发布系统,用户订阅新闻,当有新新闻发布时,用户会收到通知。
  8. 状态模式(State)

    • 目的:允许对象在内部状态改变时改变其行为,使得对象看起来像是改变了其类。
    • 示例:电梯系统,不同状态(如上升、下降、停靠)下的行为不同。
  9. 策略模式(Strategy)

    • 目的:定义一系列算法,将每一个算法封装起来,并使它们可以互换。
    • 示例:排序算法库,客户端可以选择使用不同的排序算法。
  10. 模板方法模式(Template Method)

    • 目的:定义一个操作中的算法框架,而将一些步骤延迟到子类中实现。
    • 示例:数据处理流程,定义一个模板方法来处理数据,而具体的处理步骤由子类实现。
  11. 访问者模式(Visitor)

    • 目的:在不改变类的前提下增加新的操作,定义表示一个操作的对象,并使用该对象访问数据结构中的各元素。
    • 示例:对象结构,如语法树,使用访问者模式可以对其进行操作而无需修改其定义。

结论

设计模式提供了一种解决常见软件设计问题的高效方法。通过理解和运用创建型、结构型和行为型模式,开发者可以设计出更灵活、可维护和可扩展的系统。在实际开发中,选择合适的设计模式,可以有效地提升代码质量和开发效率。希望本文对您理解设计模式的三种分类有所帮助!