当前位置: 首页 > news >正文

常用设计模式

设计模式详解

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

相关文章:

  • 宝塔SSL申请Let‘s Encrypt提示“验证信息构造失败!{}“
  • 网损仪详解
  • 深度学习笔记19-YOLOv5-C3模块实现(Pytorch)
  • win10下python脚本运行缺失ccache的问题处理
  • 性能测试~
  • 线程同步——读写锁
  • MYTOOL-记事本
  • C#基础学习(八)终章 C#中的结构体
  • Mockito 全面指南:从单元测试基础到高级模拟技术
  • 前端知识点---window.location.assign() 和 window.location.href 的区别(javascript)
  • deepseek 技术的前生今世:从开源先锋到AGI探索者
  • ETL中数据转换的三种处理方式
  • 蓝耘平台API深度剖析:如何高效实现AI应用联动
  • 周报参考模板
  • IPv6 Dhcpv6 DUID
  • 指标管理+数仓引擎:衡石ChatBI端到端平台的技术架构深度解析
  • 谷歌Android闭源与鸿蒙崛起:一场关于技术主权的生态博弈
  • 第二章VRP介绍///Telnet///DHCP
  • 前端常问的宏观“大”问题详解
  • Anaconda开始菜单里添加JupyterLab快捷方式
  • 6黄页网站建设/搜索优化网络推广
  • 外贸网站建设软件/百度北京总部电话
  • 做批发网站有哪些/百度指数教程
  • 100个好听到爆的公司名字/wifi优化大师下载
  • 专业的广州商城网站建设/iis搭建网站
  • centos wordpress 建站教程/谷歌搜索指数查询