二十五、Spring中用到的设计模式汇总

yumo6662个月前 (03-07)技术文章98

前面用了很大的篇幅分别讨论了23种常用的设计模式,之后用一篇文章总结了这23种设计模式。并总结出了所有设计模式都在回答三个关于如何创建、如何组织、如何交互的终极问题。现在再通过一个Spring源码来分析,如何使用这些设计模式。

Spring框架涵盖创建型、结构型、行为型三大类别,以及十余种设计模式。下面分别把每个设计模式列举出来,并列举其关键代码。好了,废话少说,我们开始吧。

1. 单例模式(Singleton Pattern)

设计目的:确保Bean全局唯一,节省资源并提升性能。
应用场景:Spring默认Bean作用域为单例。
代码示例

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}
// 任意地方获取同一实例
@Autowired
private MyService service1; // 与service2为同一实例
@Autowired
private MyService service2;

2. 工厂方法模式(Factory Method Pattern)

设计目的:解耦对象创建逻辑,支持扩展。
应用场景:BeanFactory通过工厂方法创建Bean实例。
代码示例

public interface FactoryBean {
    T getObject() throws Exception;
    Class getObjectType();
}

public class MyBeanFactory implements FactoryBean {
    @Override
    public String getObject() {
        return "Factory-Generated String";
    }
}
// 配置文件中声明

3. 代理模式(Proxy Pattern)

设计目的:AOP实现核心,动态添加横切逻辑。
应用场景:事务管理、日志记录。
代码示例

@Aspect
@Component
public class TransactionAspect {
    @Around("execution(* com.example.service.*.*(..))")
    public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
        // 事务开始
        Object result = pjp.proceed();
        // 事务提交
        return result;
    }
}

4. 模板方法模式(Template Method Pattern)

设计目的:封装通用流程,子类定制细节。
应用场景:JdbcTemplate简化数据库操作。
代码示例

java
public class JdbcTemplate {
    public  T query(String sql, RowMapper rowMapper) {
        // 通用流程:连接获取、执行SQL、结果映射
        return rowMapper.mapRow(resultSet, 0);
    }
}
// 使用示例
jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> new User(rs.getInt("id")));

5. 观察者模式(Observer Pattern)

设计目的:事件驱动解耦,支持松耦合通信。
应用场景:Spring事件机制(如ContextRefreshedEvent)。
代码示例

public class UserCreatedEvent extends ApplicationEvent {
    private User user;
    public UserCreatedEvent(Object source, User user) {
        super(source);
        this.user = user;
    }
}

@Component
public class UserEventListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(UserCreatedEvent event) {
        // 处理事件
        System.out.println("User created: " + event.getUser());
    }
}

6. 策略模式(Strategy Pattern)

设计目的:算法族封装,动态切换策略。
应用场景:ResourceLoader根据路径选择加载策略。
代码示例

public interface ResourceLoader {
    Resource getResource(String location);
}

public class ClassPathResourceLoader implements ResourceLoader {
    @Override
    public Resource getResource(String location) {
        return new ClassPathResource(location);
    }
}

public class FileSystemResourceLoader implements ResourceLoader {
    @Override
    public Resource getResource(String location) {
        return new FileSystemResource(location);
    }
}

7. 适配器模式(Adapter Pattern)

设计目的:统一接口,兼容不同实现。
应用场景:Spring MVC的HandlerAdapter适配不同Controller。
代码示例

public interface HandlerAdapter {
    boolean supports(Object handler);
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler);
}

public class SimpleControllerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return handler instanceof MyController;
    }
    @Override
    public ModelAndView handle(...) {
        // 调用具体Controller方法
    }
}

8. 装饰者模式(Decorator Pattern)

设计目的:动态扩展功能,不修改原有类。
应用场景:Spring AOP的环绕通知(@Around)。
代码示例

public class LoggingDecorator implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // 前置日志
        System.out.println("Method called: " + invocation.getMethod().getName());
        Object result = invocation.proceed();
        // 后置日志
        return result;
    }
}

9. 简单工厂模式(非GOF标准)

设计目的:集中管理对象创建逻辑。
应用场景:BeanFactory根据配置创建Bean。
代码示例

public class BeanFactory {
    private Map singletonObjects = new ConcurrentHashMap<>();
    
    public Object getBean(String name) {
        // 根据name从singletonObjects获取实例
        return singletonObjects.get(name);
    }
    
    public void registerBean(String name, Object bean) {
        singletonObjects.put(name, bean);
    }
}

10. 责任链模式(Chain of Responsibility)

设计目的:请求逐级传递,灵活处理。
应用场景:Spring Security过滤器链。
代码示例

public class CustomFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(...) {
        // 处理请求
        chain.doFilter(request, response); // 传递给下一个过滤器
    }
}

相关文章

Java设计模式之桥接模式

一、概述这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例,然后返回来理解概念,不然抽象的概念会让你崩溃...桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的...