设计模式详解
1. 单例模式:双重检查锁(volatile禁止指令重排序)
核心思想:确保一个类仅有一个实例,并提供全局访问点。
双重检查锁实现:
public class Singleton {
private static volatile Singleton instance; // volatile禁止指令重排序
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次检查:避免不必要的同步
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查:确保实例未创建
instance = new Singleton();
}
}
}
return instance;
}
}
关键点:
- 双重检查:减少同步代码块的使用,提升性能。
- volatile作用:禁止JVM指令重排序,防止其他线程获取未初始化完成的实例(对象初始化分三步:分配内存→初始化对象→指向内存地址,若重排序可能导致中间状态暴露)。
2. 工厂模式:Spring BeanFactory
核心思想:将对象创建与使用解耦,由工厂统一管理实例化过程。
Spring BeanFactory:
- 功能:Spring IoC容器的核心接口,负责创建、配置和管理Bean。
- 实现方式:
- 简单工厂:通过静态方法返回具体对象。
- 工厂方法:定义接口,子类决定实例化哪个类。
- Spring中的扩展:
ApplicationContext
继承BeanFactory
,支持自动装配、事件发布等高级功能。- 通过XML配置或注解(如
@Component
,@Bean
)定义Bean的创建规则。
3. 代理模式:AOP动态代理
核心思想:通过代理对象控制对目标对象的访问,增强功能(如日志、事务)。
Spring AOP实现:
- JDK动态代理:基于接口,运行时生成代理类(要求目标类实现接口)。
- CGLIB代理:基于继承,生成目标类的子类作为代理(适用于无接口的类)。
示例:
// 目标类
public class UserServiceImpl implements UserService {
public void save() { /* 业务逻辑 */ }
}
// 切面增强
@Aspect
public class LogAspect {
@Before("execution(* save(..))")
public void logBefore() { /* 记录日志 */ }
}
动态代理流程:
- 切面定义增强逻辑(Advice)。
- 代理工厂在运行时生成代理对象。
- 调用代理方法时,按顺序执行增强逻辑和目标方法。
4. 观察者模式:Spring事件机制
核心思想:定义对象间的一对多依赖,当主题状态变化时,自动通知所有观察者。
Spring事件机制:
- 核心组件:
- 事件:继承
ApplicationEvent
(如ContextRefreshedEvent
)。 - 发布者:调用
ApplicationContext.publishEvent()
发布事件。 - 监听者:实现
ApplicationListener
接口或使用@EventListener
注解。
示例:
- 事件:继承
// 自定义事件
public class OrderEvent extends ApplicationEvent { /* 订单事件 */ }
// 监听者
@Component
public class OrderListener {
@EventListener
public void handleEvent(OrderEvent event) { /* 处理事件 */ }
}
// 发布事件
applicationContext.publishEvent(new OrderEvent("订单创建"));
特点:支持同步/异步处理,通过@Async
实现异步监听。
5. 其他常见设计模式
- 模板方法模式:Spring JdbcTemplate定义算法骨架,子类实现具体步骤。
- 适配器模式:Spring MVC的
HandlerAdapter
适配不同处理器(如Controller、Servlet)。 - 装饰器模式:Java I/O流(如
BufferedReader
包装FileReader
)。
总结
设计模式是解决特定场景问题的经验总结,结合框架(如Spring)可显著提升代码复用性、扩展性和可维护性。理解模式的核心思想比死记实现更重要!