常见设计模式总结

创建型模式

创建型模式主要关注对象的创建过程,常见的模式包括:

1. 单例模式 (Singleton)

确保一个类只有一个实例,并提供全局访问点。

应用场景:

  • 配置管理类

  • 线程池管理

示例代码:

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

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

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

应用场景:

  • 当一个类不知道它所必须创建的对象的类时

示例代码:

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

提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。

应用场景:

  • 需要创建一系列相关的产品对象

示例代码:

4. 建造者模式 (Builder)

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

应用场景:

  • 创建复杂对象的过程

示例代码:

5. 原型模式 (Prototype)

通过复制现有的实例来创建新的实例。

应用场景:

  • 当创建对象的成本较高时

示例代码:

结构型模式

结构型模式关注类或对象的组合,常见的模式包括:

1. 适配器模式 (Adapter)

将一个类的接口转换成客户希望的另一个接口。

应用场景:

  • 需要使用一个已有的类,但其接口不符合需求

示例代码:

2. 装饰器模式 (Decorator)

动态地给一个对象添加一些额外的职责。

应用场景:

  • 需要扩展一个类的功能

示例代码:

3. 代理模式 (Proxy)

为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

  • 需要控制对某个对象的访问

示例代码:

4. 外观模式 (Facade)

为复杂子系统提供一个统一的接口。

应用场景:

  • 简化与复杂系统的交互

示例代码:

5. 桥接模式 (Bridge)

将抽象部分与实现部分分离,使它们可以独立变化。

应用场景:

  • 当需要在多个维度上变化时

示例代码:

6. 组合模式 (Composite)

将对象组合成树形结构以表示部分-整体的层次。

应用场景:

  • 需要表示部分与整体的层次结构

示例代码:

7. 享元模式 (Flyweight)

运用共享技术有效地支持大量细粒度的对象。

应用场景:

  • 当需要大量相似对象时

示例代码:

行为型模式

行为型模式关注对象之间的交互,常见的模式包括:

1. 观察者模式 (Observer)

定义对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都得到通知。

应用场景:

  • 事件处理系统

示例代码:

2. 策略模式 (Strategy)

定义一系列算法, 将每一个算法封装起来, 并使它们可以互换。

应用场景:

  • 需要在运行时选择算法

示例代码:

3. 命令模式 (Command)

将请求封装为对象,从而使您可以使用不同的请求、队列或日志请求,以及支持可撤销操作。

应用场景:

  • 需要将操作参数化

示例代码:

4. 状态模式 (State)

允许对象在内部状态改变时改变它的行为。

应用场景:

  • 需要根据状态改变行为

示例代码:

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

使多个对象都有机会处理请求,从而避免请求发送者与接收者之间的耦合。

应用场景:

  • 处理请求的不同级别

示例代码:

6. 备忘录模式 (Memento)

在不违反封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

应用场景:

  • 需要保存和恢复对象的状态

示例代码:

7. 访问者模式 (Visitor)

表示一个作用于某对象结构中的各元素的操作。

应用场景:

  • 需要对对象结构中的元素进行操作

示例代码:

8. 中介者模式 (Mediator)

定义一个中介对象来封装一系列的对象交互。

应用场景:

  • 需要减少多个对象之间的复杂交互

示例代码:

9. 解释器模式 (Interpreter)

给定一个语言, 定义它的文法表示, 并定义一个解释器来处理该语言。

应用场景:

  • 需要解释特定语言的场景

示例代码:

最后更新于