设计模式详解

4 minAdvanced2026/6/14

23种GoF设计模式分类、原理与应用场景。

1. 设计模式概述

1.1 三大分

数量关注点
创建型5对象创建机制
结构型7对象组合方式
行为型11对象间通信

1.2 设计原则

原则说明
单一职责(SRP)一个只有一个变化原因
开闭原则(OCP)对扩展开放,对修改关闭
里氏替换(LSP)可以替换父
接口隔离(ISP)接口应该小而专
依赖倒置(DIP)依赖抽象而非具体
迪米特法则最少知识原则

2. 创建型模式

2.1 单例模式(Singleton)

确保一个只有一个实例:

// 双重检查锁
public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2.2 工厂方法模式(Factory Method)

定义创建对象的接口,让子决定实例化哪个

Product ←── ConcreteProduct


Creator ──→ FactoryMethod()


ConcreteCreator ──→ FactoryMethod() → ConcreteProduct

2.3 抽象工厂模式(Abstract Factory)

创建一组相关对象的接口

AbstractFactory
├── createProductA()
└── createProductB()


ConcreteFactory1 → ProductA1, ProductB1
ConcreteFactory2 → ProductA2, ProductB2

2.4 建造者模式(Builder)

分步骤构建复杂对象:

User user = User.builder()
    .name("张三")
    .age(25)
    .email("zhangsan@example.com")
    .build();

2.5 原型模式(Prototype)

通过克隆创建对象:

public class Prototype implements Cloneable {
    public Prototype clone() {
        return (Prototype) super.clone();
    }
}

3. 结构型模式

3.1 适配器模式(Adapter)

将一个接口转换为客户期望的接口

Client → [Target接口] ← [Adapter] → [Adaptee]

3.2 装饰器模式(Decorator)

动态地给对象添加职责:

Component ←── Decorator
   ▲            ▲
   │            │
ConcreteComponent  ConcreteDecorator
InputStream in = new FileInputStream("file.txt");
in = new BufferedInputStream(in);    // 装饰:缓冲
in = new GZIPInputStream(in);         // 装饰:解压

3.3 代理模式(Proxy)

控制对对象的访问:

代理说明
虚拟代理延迟创建开销大的对象
远程代理为远程对象提供本地代表
保护代理控制访问权限
智能引用添加额外操作(引用计数)

3.4 其他结构型模式

模式
外观(Facade)为子系统提供统一接口
桥接(Bridge)分离抽象与实现
组合(Composite)树形结构统一处理
享元(Flyweight)共享对象减少内存

4. 行为型模式

4.1 观察者模式(Observer)

定义对象间一对多的依赖关系:

Subject
├── attach(observer)
├── detach(observer)
└── notify() ──→ Observer.update()

        ┌───────────┼───────────┐
   ConcreteObserver1  ConcreteObserver2

4.2 策略模式(Strategy)

定义算法族,封装后使它们可以互换:

interface SortStrategy {
    void sort(int[] array);
}

class QuickSort implements SortStrategy { ... }
class MergeSort implements SortStrategy { ... }

class Sorter {
    private SortStrategy strategy;
    public void setStrategy(SortStrategy s) { this.strategy = s; }
    public void sort(int[] arr) { strategy.sort(arr); }
}

4.3 模板方法模式(Template Method)

定义算法骨架,子实现具体步骤:

abstract class DataProcessor {
    public final void process() {  // 模板方法
        readData();
        transformData();
        writeData();
    }
    protected abstract void readData();
    protected abstract void transformData();
    protected void writeData() { /* 默认实现 */ }
}

4.4 其他行为型模式

模式
命令(Command)将请求封装为对象
迭代器(Iterator)顺序访问集合元素
中介者(Mediator)集中管理对象间交互
备忘录(Memento)保存和恢复对象状态
状态(State)允许对象在状态改变时改变行为
职责链(Chain of Responsibility)沿链传递请求
访问者(Visitor)在不改变的前提下添加操作
解释器(Interpreter)定义语言的文法及解释器

5. 模式选择指南

问题推荐模式
需要唯一实例单例
创建对象逻辑复杂工厂方法/抽象工厂
分步构建复杂对象建造者
接口不兼容适配器
动态添加功能装饰器
一对多依赖观察者
算法可替换策略
算法骨架固定模板方法
请求需要排队/撤销命令
状态驱动的行为状态