Spring涉及的設計模式以及實際使用場景(含代碼)
1.工廠模式(Factory Pattern)
作用: 隱藏對象創建的細節,通過工廠類統一管理對象的實例化。
場景:Spring的BeanFactory和ApplicationContext是工廠模式的典型實現。
// 通過ApplicationContext獲取Bean
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);// 自定義 FactoryBean
public class MyFactoryBean implements FactoryBean<MyObject> {@Overridepublic MyObject getObject() throws Exception {return new MyObject(); // 復雜對象的創建邏輯}@Overridepublic Class<?> getObjectType() {return MyObject.class;}
}
2.單例模式(Singleton Pattern)
作用:確保一個類只有一個實例,并提供全局訪問點。
場景:Spring默認的Bean的作用域為單例。
@Service // 默認 singleton
public class OrderService {// ...
}// 測試單例
OrderService bean1 = context.getBean(OrderService.class);
OrderService bean2 = context.getBean(OrderService.class);
System.out.println(bean1 == bean2); // 輸出 true
3.代理模式(Proxy Pattern)
作用:通過代理對象控制對目標對象的訪問,用于增強功能(AOP)
場景:Spring AOP通過動態代理實現日志,事務等功能。
@Aspect
@Component
public class LogAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("方法調用前: " + joinPoint.getSignature().getName());}
}// 使用 @Transactional 注解(基于代理實現事務)
@Transactional
public void transferMoney(Account from, Account to, double amount) {// 轉賬邏輯
}
4.模版方法模式(Template Method Pattern)
作用:定義算法的骨架,將某些步驟延遲到子類中實現
場景:JdbcTemplate封裝了JDBC的固定流程
@Autowired
private JdbcTemplate jdbcTemplate;public List<User> getUsers() {return jdbcTemplate.query("SELECT * FROM users",(rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age")));
}
5.觀察者模式(Observer Pattern)
作用:定義對象間的一對多依賴,當一個對象狀態變化時,自動通知依賴它的對象。
場景:Spring事件監聽機制
// 自定義事件
public class OrderEvent extends ApplicationEvent {public OrderEvent(String orderId) {super(orderId);}
}// 監聽器
@Component
public class OrderEventListener implements ApplicationListener<OrderEvent> {@Overridepublic void onApplicationEvent(OrderEvent event) {System.out.println("處理訂單事件: " + event.getSource());}
}// 發布事件
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder() {publisher.publishEvent(new OrderEvent("ORDER_123"));
}
6.策略模式(Strategy Pattern)
作用:定義一系列算法,使其可以互相替換,獨立于客戶端發生變化
場景:Spring的ResourceLoader根據前綴選擇資源加載策略
ResourceLoader loader = new DefaultResourceLoader();
Resource fileResource = loader.getResource("file:/tmp/test.txt");
Resource classpathResource = loader.getResource("classpath:application.yml");
7.適配器模式(Adapter Pattern)
作用:將一個接口轉換成客戶期待的接口
場景:Spring MVC 的 HandlerAdapter
適配不同 Controller。
// 模擬 SimpleControllerHandlerAdapter 的適配邏輯
public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return handler instanceof Controller;}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {return ((Controller) handler).handleRequest(request, response);}
}
8.裝飾器模式(Decorator Pattern)
作用:動態為對象添加額外職責
場景:Spring對HttpServletRequest的包裝
// 自定義裝飾器
public class LoggingRequestWrapper extends HttpServletRequestWrapper {public LoggingRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {System.out.println("獲取參數: " + name);return super.getParameter(name);}
}// 在 Filter 中使用
public class LogFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {chain.doFilter(new LoggingRequestWrapper((HttpServletRequest) request), response);}
}
9.責任鏈模式(Chain of Responsibility Pattern)
作用:將請求的發送者和接收者解耦,通過鏈式處理請求。
場景:Spring Security 的過濾器鏈。
// 模擬過濾器鏈
public class FilterChainDemo {private List<Filter> filters = new ArrayList<>();public void addFilter(Filter filter) {filters.add(filter);}public void doFilter(HttpServletRequest request) {for (Filter filter : filters) {filter.execute(request);}}
}// 使用
FilterChainDemo chain = new FilterChainDemo();
chain.addFilter(new AuthFilter());
chain.addFilter(new LoggingFilter());
chain.doFilter(request);
10.原型模式(prototype Pattern)
作用:通過復制現有對象來創建新對象,避免重復初始化開銷
場景:Spring 的 prototype
作用域 Bean。
@Component
@Scope("prototype")
public class PaymentService {// 每次獲取都是新實例
}// 測試
PaymentService bean1 = context.getBean(PaymentService.class);
PaymentService bean2 = context.getBean(PaymentService.class);
System.out.println(bean1 == bean2); // 輸出 false
11.建造者模式(Builder Pattern)
作用:分步驟構建復雜對象
場景:RestTemplateBuilder構建復雜對象
RestTemplate restTemplate = new RestTemplateBuilder().rootUri("https://api.example.com").defaultHeader("Authorization", "Bearer token").build();
概括
- 解耦:工廠模式、代理模式。
- 擴展性:策略模式、觀察者模式。
- 復用性:模板方法模式、適配器模式。
- 控制復雜度:責任鏈模式、裝飾器模式。