Java 设计模式新实战:23 种模式的源码级解析与现代应用场景
在软件开发的浩瀚宇宙中,设计模式如同历经考验的航海图,指引我们构建出灵活、可复用、可维护的代码。尽管 23 种经典模式(GoF 模式)提出已近三十年,但它们的内核思想在当今的 Java 开发中依然熠熠生辉,尤其是在 Spring、MyBatis 等主流框架的源码中随处可见其精妙应用。
一、设计模式并未过时,而是进化了
有人认为,在拥有强大 IoC 容器、注解和函数式编程的现代 Java 中,设计模式已经过时。这是一个巨大的误解。设计模式并非具体的代码片段,而是解决特定问题的经验总结和设计思路。现代框架本身就是设计模式的集大成者,而我们在业务开发中,则是在更'高层'运用这些模式的思想。
例如,随着 Java 8 引入 Lambda 表达式和 Stream API,策略模式的实现变得前所未有的简洁,匿名内部类往往被一行 Lambda 所替代。
二、从源码到实战:三类模式精讲
我们选取创建型、结构型、行为型中各一个典型模式,看看它们的现代实现。
1. 创建型模式典范:单例模式(Singleton)与 Spring 的碰撞
单例模式确保一个类仅有一个实例。过去我们纠结于'饿汉式'、'懒汉式'、双重检查锁等写法。但在 Spring 框架统治的今天,我们对其有了新的认识。
-
源码级实现:Spring 的 IoC 容器本质上就是一个超大型的单例工厂。通过默认的
singleton作用域,Spring 管理的 Bean 默认就是单例的。其源码实现远比传统的单例模式复杂和强大,它通过ConcurrentHashMap实现单例注册表,并处理了循环依赖等复杂问题。 -
现代应用场景:
- 无状态工具类:如日期转换器、加密工具等,适合用 Spring 管理为单例。
- 数据库连接池:连接池本身必须是单例的,以确保资源可控。
- 最佳实践:不要简单地用
private static实例来实现单例,而应优先使用 Spring 的容器管理。对于非 Spring 环境的轻量级库,枚举单例(Enum)是实现单例的最佳方式,由 JVM 保证绝对的单例性,并能有效防御序列化攻击。
2. 结构型模式核心:代理模式(Proxy)与 AOP 的基石
代理模式为其他对象提供一种代理以控制对这个对象的访问。这是 Spring AOP(面向切面编程)的核心。
-
源码级实现:Spring AOP 默认使用JDK 动态代理(基于接口)和CGLIB 字节码增强(基于子类)来创建代理对象。当你使用
@Transactional注解时,Spring 会在运行时为你的事务 Bean 创建一个代理,代理对象在目标方法执行前后自动处理事务的开启、提交/回滚。 -
现代应用场景:
- 声明式事务管理(
@Transactional):这是代理模式最经典的应用。 - 日志记录、性能监控:通过 AOP 可以无侵入地为方法添加通用逻辑。
- 安全控制(
@PreAuthorize):在方法调用前进行权限校验。 - RPC 框架:在 Dubbo、gRPC 等框架中,客户端拿到的'服务'实际上是一个网络通信的代理。
- 声明式事务管理(
3. 行为型模式精华:观察者模式(Observer)与事件驱动架构
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
-
源码级实现:Java 提供了内置的 和 ,但功能较弱。现代 Java 应用更倾向于使用更强大的。Spring Framework 提供了完整的事件发布 - 监听模型:

