常用设计模式

发布于:2025-03-29 ⋅ 阅读:(30) ⋅ 点赞:(0)

设计模式详解

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() { /* 记录日志 */ }
}

动态代理流程

  1. 切面定义增强逻辑(Advice)。
  2. 代理工厂在运行时生成代理对象。
  3. 调用代理方法时,按顺序执行增强逻辑和目标方法。

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)可显著提升代码复用性、扩展性和可维护性。理解模式的核心思想比死记实现更重要!


网站公告

今日签到

点亮在社区的每一天
去签到