设计模式知识体系概览(Java)
什么是设计模式?
设计模式(Design Pattern) 是在软件开发中反复出现的问题的通用解决方案。它不是可以直接复制粘贴的代码,而是一套经过验证的设计经验和思维模板。
1994 年,四位作者(被称为 GoF,Gang of Four)在《设计模式:可复用面向对象软件的基础》中总结了 23 种经典设计模式,分为三大类:
| 类型 | 数量 | 解决的问题 | 典型模式 |
|---|---|---|---|
| 创建型 | 5 | 如何创建对象 | 单例、工厂、建造者 |
| 结构型 | 7 | 如何组合类和对象 | 代理、适配器、装饰器、外观 |
| 行为型 | 11 | 对象之间如何通信和分工 | 策略、观察者、模板方法、责任链 |
为什么 Java 面试必考设计模式?
Java 生态——尤其是 Spring 框架——大量运用了设计模式。理解设计模式不仅是面试要求,更是理解框架源码的钥匙:
| 模式 | Java/Spring 中的应用 |
|---|---|
| 单例 | Spring Bean 默认是单例的 |
| 工厂 | BeanFactory 创建 Bean、LoggerFactory 创建日志对象 |
| 代理 | Spring AOP(JDK 动态代理 / CGLIB) |
| 模板方法 | JdbcTemplate、AbstractQueuedSynchronizer(AQS) |
| 观察者 | Spring 事件机制(ApplicationEvent / @EventListener) |
| 策略 | Spring 中 @Autowired 注入不同实现类 |
| 适配器 | HandlerAdapter 适配不同类型的 Controller |
| 装饰器 | Java IO 流(BufferedInputStream 装饰 FileInputStream) |
| 责任链 | Servlet Filter、Spring Interceptor、Spring Security |
| 建造者 | Lombok @Builder、StringBuilder |
核心模式简介
单例模式——全局唯一实例
单例模式确保一个类只有一个实例,并提供全局访问点。Java 中最推荐的实现方式是枚举单例(天然防反射、防序列化)和静态内部类(延迟加载):
// 推荐:枚举单例(最安全)
public enum Singleton {
INSTANCE;
public void doSomething() { }
}
面试常考的双重检测锁(DCL) 需要 volatile 防止指令重排序。
工厂模式——封装对象创建
工厂模式将对象的创建逻辑从使用方剥离出来:
- 简单工厂:一个工厂方法根据参数决定创建哪个对象
- 工厂方法:每个产品对应一个工厂类
- 抽象工厂:创建一族相关产品
Spring 的 BeanFactory 就是工厂模式的典范——你不需要 new 对象,而是从工厂获取。
代理模式——增强对象行为
代理模式在不修改目标对象代码的前提下,对其行为进行增强(如添加日志、事务、权限检查)。Spring AOP 的底层实现:
- JDK 动态代理:目标类实现了接口,基于
Proxy+InvocationHandler - CGLIB 代理:目标类没有接口,基于字节码生成子类
策略模式——消除 if-else
策略模式将一组算法封装成独立的策略类,让它们可以互换。最典型的应用是替代复杂的 if-else 或 switch-case:
// 策略接口
public interface PayStrategy {
void pay(BigDecimal amount);
}
// Spring 自动收集所有策略实现
@Autowired
private Map<String, PayStrategy> strategyMap;
// 根据支付方式选择策略,替代 if-else
public void pay(String type, BigDecimal amount) {
strategyMap.get(type).pay(amount);
}
观察者模式——事件驱动编程
观察者模式定义了一对多的依赖关系——当一个对象状态改变时,所有依赖它的对象自动得到通知。Spring 的事件机制就是观察者模式:ApplicationEventPublisher 发布事件,@EventListener 监听事件。
模板方法模式——算法骨架
模板方法模式在父类中定义算法骨架,将某些步骤延迟到子类实现。AQS 的 tryAcquire() / tryRelease() 就是留给子类实现的模板方法。
学习建议
推荐学习路径
- 单例 + 工厂 → 最基础的创建型模式
- 代理 + 装饰器 + 适配器 → 理解 Spring AOP 和 Java IO
- 策略 + 观察者 + 模板方法 → 最常用的行为型模式
- 责任链 → Filter / Interceptor 原理
- 建造者 → Lombok @Builder、链式调用
- 结合 Spring 源码理解 → 设计模式的最佳实践