跳到主要内容

设计模式知识体系概览(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)
模板方法JdbcTemplateAbstractQueuedSynchronizer(AQS)
观察者Spring 事件机制(ApplicationEvent / @EventListener
策略Spring 中 @Autowired 注入不同实现类
适配器HandlerAdapter 适配不同类型的 Controller
装饰器Java IO 流(BufferedInputStream 装饰 FileInputStream
责任链Servlet Filter、Spring Interceptor、Spring Security
建造者Lombok @BuilderStringBuilder

核心模式简介

单例模式——全局唯一实例

单例模式确保一个类只有一个实例,并提供全局访问点。Java 中最推荐的实现方式是枚举单例(天然防反射、防序列化)和静态内部类(延迟加载):

// 推荐:枚举单例(最安全)
public enum Singleton {
INSTANCE;
public void doSomething() { }
}

面试常考的双重检测锁(DCL) 需要 volatile 防止指令重排序。

工厂模式——封装对象创建

工厂模式将对象的创建逻辑从使用方剥离出来:

  • 简单工厂:一个工厂方法根据参数决定创建哪个对象
  • 工厂方法:每个产品对应一个工厂类
  • 抽象工厂:创建一族相关产品

Spring 的 BeanFactory 就是工厂模式的典范——你不需要 new 对象,而是从工厂获取。

代理模式——增强对象行为

代理模式在不修改目标对象代码的前提下,对其行为进行增强(如添加日志、事务、权限检查)。Spring AOP 的底层实现:

  • JDK 动态代理:目标类实现了接口,基于 Proxy + InvocationHandler
  • CGLIB 代理:目标类没有接口,基于字节码生成子类

策略模式——消除 if-else

策略模式将一组算法封装成独立的策略类,让它们可以互换。最典型的应用是替代复杂的 if-elseswitch-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() 就是留给子类实现的模板方法。


学习建议

推荐学习路径
  1. 单例 + 工厂 → 最基础的创建型模式
  2. 代理 + 装饰器 + 适配器 → 理解 Spring AOP 和 Java IO
  3. 策略 + 观察者 + 模板方法 → 最常用的行为型模式
  4. 责任链 → Filter / Interceptor 原理
  5. 建造者 → Lombok @Builder、链式调用
  6. 结合 Spring 源码理解 → 设计模式的最佳实践

相关链接