设计模式--spring中用到的设计模式

一、单例模式(Singleton Pattern)

  • 定义:确保一个类只有一个实例,并提供全局访问点

  • Spring中的应用:Spring默认将Bean配置为单例模式

  • 案例:

复制代码
@Component
public class MySingletonBean {
    // Spring 默认将其管理为单例
}
  • 在spring容器中,MySingletonBean只会有一个实例

二、工厂模式(Factory Pattern)

  • 定义:定义一个创建对象的接口,由子类决定实例化哪个类

  • spring中的应用:BeanFactory和ApplicationContext是工厂模式的实现

  • 案例:

复制代码
@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
  • AppConfig是一个工厂类,myBean()方法负责创建MyBean实例

三、原型模式(Prototype Pattern)

  • 定义:通过复制现有对象来创建新对象

  • Spring中的应用:通过@Scope("prototype")配置Bean为原型模式

  • 案例

复制代码
@Component
@Scope("prototype")
public class MyPrototypeBean {
    // 每次获取时都会创建一个新实例
}

四、模板方法模式(Template Method Pattern)

  • 定义:定义一个算法的骨架,将某些步骤延迟到子类中实现

  • Spring中的应用:JdbcTemplate、RestTemplate等

  • 案例:

复制代码
@Autowired
private JdbcTemplate jdbcTemplate;
​
public void queryData() {
    String sql = "SELECT * FROM users";
    jdbcTemplate.query(sql, (rs, rowNum) -> {
        System.out.println(rs.getString("username"));
        return null;
    });
}

五、适配器模式(Adapter Pattern)

  • 定义:将一个类的接口转换成客户端期望的另一个接口

  • spring中的应用:Spring MVC中的HandlerAdapter

  • 案例:

复制代码
@Controller
public class MyController {
    @RequestMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

六、装饰者模式(Decorator Pattern)

  • 定义:动态地为对象添加额外的职责

  • spring中的应用:spring AOP中的代理

  • 案例:

复制代码
@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}
  • AOP通过装饰者模式为方法添加日志功能

七、观察者模式(Observer Pattern)

  • 定义:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖对象都会收到通知

  • spring容器中的应用:Spring的事件机制

  • 案例:

复制代码
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("Event received: " + event.getMessage());
    }
}
​
@Component
public class MyEventPublisher {
    @Autowired
    private ApplicationEventPublisher publisher;
​
    public void publishEvent(String message) {
        publisher.publishEvent(new MyEvent(this, message));
    }
}
  • MyEventPublisher发布事件,MyEventListener监听并处理

八、代理模式(Proxy Pattern)

  • 定义:为其他对象提供一个代理以控制对这个对象的访问

  • Spring中的应用:SpringAOP和动态代理

  • 案例:

复制代码
@Service
public class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}
​
@Aspect
@Component
public class MyAspect {
    @Around("execution(* com.example.service.MyService.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before method");
        Object result = joinPoint.proceed();
        System.out.println("After method");
        return result;
    }
}
  • AOP通过代理模式为MyService的方法添加额外逻辑

九、组合模式(Composite Pattern)

  • 定义:将对象组合成树形结构以表示"部分-整体"的层次结构

  • spring中的应用:Spring Security的过滤器链

  • 案例:

复制代码
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .antMatchers("/private/**").authenticated();
    }
}
  • Spring Security将多个过滤器组合成一个过滤器链

十、策略模式(Strategy Pattern)

  • 定义:定义一系列算法,将它们封装起来,并使它们可以互相替换

  • Spring中的应用:Spring的资源加载策略(ResourceLoader)

  • 案例:

复制代码
@Autowired
private ResourceLoader resourceLoader;
​
public void loadResource() {
    Resource resource = resourceLoader.getResource("classpath:data.txt");
    System.out.println("Resource loaded: " + resource.exists());
}
  • ResourceLoader根据不同的资源加载策略加载资源(如文件系统、类路径等)。
相关推荐
学Linux的语莫3 分钟前
机器学习数据处理
java·算法·机器学习
找不到、了3 分钟前
JVM的即时编译JIT的介绍
java·jvm
rongqing201921 分钟前
Google 智能体设计模式:人机协同(HITL)
设计模式
西瓜er36 分钟前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .40 分钟前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮1 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀1 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
Javatutouhouduan1 小时前
Java程序员如何深入学习JVM底层原理?
java·jvm·java面试·后端开发·java架构师·java程序员·互联网大厂
王嘉俊9251 小时前
设计模式--享元模式:优化内存使用的轻量级设计
java·设计模式·享元模式
2301_803554522 小时前
C++联合体(Union)详解:与结构体的区别、联系与深度解析
java·c++·算法