有哪些设计模式及各自特点

2025-3-12 diaba

设计模式(Design Patterns)是软件工程中用于解决常见问题的可复用解决方案。它们是经过验证的最佳实践,能够帮助开发者提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。

以下是常见的设计模式及其特点:


一、创建型模式(Creational Patterns)

创建型模式用于创建对象,同时隐藏创建逻辑,而不是直接使用new操作符实例化对象。这些模式可以简化对象的创建过程,并提供更好的灵活性。

1. 单例模式(Singleton Pattern)

  • 特点:确保一个类只有一个实例,并提供一个全局访问点。
  • 适用场景:全局配置管理器、线程池、缓存等。
  • 优点
    • 控制实例数量,节省系统资源。
    • 提供全局访问点,方便管理和使用。
  • 缺点
    • 如果单例实例未正确销毁,可能导致内存泄漏。
    • 单例模式可能与多线程环境冲突,需要额外处理线程安全。

2. 工厂方法模式(Factory Method Pattern)

  • 特点:定义一个创建对象的接口,由子类决定实例化哪一个类。
  • 适用场景:当类的实例化逻辑复杂,或者需要根据条件创建不同类型的对象时。
  • 优点
    • 将对象的创建逻辑封装在工厂类中,降低客户端与具体类的耦合。
    • 方便扩展新的产品类型。
  • 缺点
    • 每增加一个产品类,就需要增加一个对应的工厂类。

3. 抽象工厂模式(Abstract Factory Pattern)

  • 特点:创建相关或依赖对象的家族,而不需明确指定具体类。
  • 适用场景:当需要创建一组相关对象时。
  • 优点
    • 将对象的创建逻辑集中管理,方便扩展和维护。
    • 提高系统的灵活性和可扩展性。
  • 缺点
    • 增加系统复杂度,抽象工厂类和具体工厂类较多。

4. 建造者模式(Builder Pattern)

  • 特点:逐步构建一个复杂的对象,并允许用户只通过指定复杂对象的类型和内容就能构建它们。
  • 适用场景:当对象的构造过程复杂,且需要根据不同的参数构建不同的对象时。
  • 优点
    • 将对象的构建逻辑与表示分离,方便扩展。
    • 可以灵活地构建不同类型的对象。
  • 缺点
    • 增加了系统的复杂度,代码量较多。

5. 原型模式(Prototype Pattern)

  • 特点:通过复制现有对象来创建新对象,而不是通过新建实例。
  • 适用场景:当对象的创建过程复杂,或者需要频繁创建相似对象时。
  • 优点
    • 提高性能,减少实例化开销。
    • 方便创建复杂对象。
  • 缺点
    • 需要实现克隆接口,增加了代码复杂度。

二、结构型模式(Structural Patterns)

结构型模式用于处理对象之间的组合关系,通过组合多个对象来实现更复杂的功能。

1. 适配器模式(Adapter Pattern)

  • 特点:将一个类的接口转换成客户端期望的另一个接口。
  • 适用场景:当需要使用一个已有的类,但其接口不符合需求时。
  • 优点
    • 提高类的复用性,让原本不兼容的类可以一起工作。
  • 缺点
    • 增加系统的复杂度,适配器类可能难以维护。

2. 装饰器模式(Decorator Pattern)

  • 特点:动态地给一个对象添加额外的职责,而不改变其结构。
  • 适用场景:当需要在运行时动态地给对象添加功能时。
  • 优点
    • 提供比继承更灵活的扩展方式。
    • 可以动态组合功能。
  • 缺点
    • 装饰器过多可能导致系统复杂度增加。

3. 代理模式(Proxy Pattern)

  • 特点:为其他对象提供代理,以控制对这个对象的访问。
  • 适用场景:当需要控制对对象的访问,或者延迟对象的创建时。
  • 优点
    • 可以控制对象的访问权限。
    • 提供懒加载、缓存等功能。
  • 缺点
    • 增加系统的复杂度,代理类可能难以维护。

4. 外观模式(Facade Pattern)

  • 特点:提供一个统一的高层接口,用于访问子系统中的一群接口。
  • 适用场景:当需要简化复杂子系统的使用时。
  • 优点
    • 提高系统的易用性。
    • 降低客户端与子系统之间的耦合。
  • 缺点
    • 可能隐藏子系统的复杂性,导致问题难以排查。

5. 桥接模式(Bridge Pattern)

  • 特点:将抽象与实现解耦,让它们可以独立变化。
  • 适用场景:当需要将接口与实现分离时。
  • 优点
    • 提高系统的可扩展性。
    • 方便独立修改接口和实现。
  • 缺点
    • 增加系统的复杂度。

6. 组合模式(Composite Pattern)

  • 特点:将对象组合成树形结构,以表示“部分-整体”的层次结构。
  • 适用场景:当需要处理对象的层次结构时。
  • 优点
    • 提高代码的复用性。
    • 方便操作树形结构。
  • 缺点
    • 增加系统的复杂度。

7. 享元模式(Flyweight Pattern)

  • 特点:通过共享来高效地支持大量细粒度的对象。
  • 适用场景:当需要创建大量相似对象时。
  • 优点
    • 提高性能,减少内存占用。
  • 缺点
    • 需要管理共享对象池,增加了代码复杂度。

三、行为型模式(Behavioral Patterns)

行为型模式用于处理对象之间的通信和职责分配。

1. 策略模式(Strategy Pattern)

  • 特点:定义一系列算法,将每个算法封装起来,并使它们可以互换。
  • 适用场景:当需要在运行时动态选择算法时。
  • 优点
    • 提供算法的可切换性。
    • 提高代码的复用性。
  • 缺点
    • 增加系统的复杂度。

2. 模板方法模式(Template Method Pattern)

  • 特点:定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。
  • 适用场景:当需要固定算法的某些步骤,而让其他步骤可扩展时。
  • 优点
    • 提高代码的复用性。
    • 提供统一的算法框架。
  • 缺点
    • 子类可能违反封装原则。

3. 观察者模式(Observer Pattern)

  • 特点:对象间的一对多依赖关系,当一个对象改变时,所有依赖于它的对象都会得到通知。
  • 适用场景:当需要实现事件驱动机制时。
  • 优点
    • 实现对象间的松耦合。
    • 提供事件通知机制。
  • 缺点
    • 如果观察者过多,可能导致性能问题。

4. 迭代器模式(Iterator Pattern)

  • 特点:顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
  • 适用场景:当需要遍历复杂数据结构时。
  • 优点
    • 提供统一的遍历接口。
    • 隐藏数据结构的内部细节。
  • 缺点
    • 增加系统的复杂度。

5. 责任链模式(Chain of Responsibility Pattern)

  • 特点:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  • 适用场景:当需要处理多个请求,且每个请求可能由不同的对象处理时。
  • 优点
    • 提供请求的解耦。
    • 提高系统的灵活性。
  • 缺点
    • 如果链过长,可能导致性能问题。

6. 命令模式(Command Pattern)

  • 特点:将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
  • 适用场景:当需要实现命令的撤销、重做或日志记录时。
  • 优点
    • 提供请求的封装。
    • 支持撤销和重做。
  • 缺点
    • 增加系统的复杂度。

7. 备忘录模式(Memento Pattern)

  • 特点:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  • 适用场景:当需要实现对象状态的

发表评论:

Powered by emlog 京ICP备15045175号-1 Copyright © 2022