策略模式与工厂模式实战引言策略模式和工厂模式是最常用的行为型和创建型设计模式在Spring应用中有广泛的应用场景。策略模式允许在运行时选择不同的算法或行为工厂模式则封装对象的创建过程。本文将详细介绍这两种模式在Spring中的实战应用包括支付策略、折扣计算、消息发送等典型场景。一、策略模式基础1.1 策略接口定义public interface PaymentStrategy { PayResult pay(Order order); RefundResult refund(Order order); default boolean supports(PaymentChannel channel) { return true; } } public enum PaymentChannel { ALIPAY, WECHAT_PAY, UNION_PAY, CREDIT_CARD } Data public class Order { private Long id; private BigDecimal amount; private PaymentChannel channel; // ... }1.2 策略实现Component public class AlipayStrategy implements PaymentStrategy { Override public PayResult pay(Order order) { // 调用支付宝SDK AlipayTradeService service new AlipayTradeService(); AlipayTradePayResponse response service.pay(order); return PayResult.builder() .success(response.isSuccess()) .transactionId(response.getTradeNo()) .amount(order.getAmount()) .build(); } Override public RefundResult refund(Order order) { // 支付宝退款逻辑 return null; } Override public boolean supports(PaymentChannel channel) { return channel PaymentChannel.ALIPAY; } } Component public class WechatPayStrategy implements PaymentStrategy { Override public PayResult pay(Order order) { // 调用微信支付SDK return PayResult.builder() .success(true) .transactionId(wx UUID.randomUUID()) .amount(order.getAmount()) .build(); } Override public RefundResult refund(Order order) { // 微信退款逻辑 return null; } Override public boolean supports(PaymentChannel channel) { return channel PaymentChannel.WECHAT_PAY; } }1.3 策略工厂Service public class PaymentStrategyFactory { private final MapPaymentChannel, PaymentStrategy strategies; public PaymentStrategyFactory( ListPaymentStrategy strategyList) { this.strategies strategyList.stream() .collect(Collectors.toMap( this::detectChannel, Function.identity() )); } private PaymentChannel detectChannel(PaymentStrategy strategy) { if (strategy instanceof AlipayStrategy) { return PaymentChannel.ALIPAY; } else if (strategy instanceof WechatPayStrategy) { return PaymentChannel.WECHAT_PAY; } throw new IllegalArgumentException(Unknown strategy); } public PaymentStrategy getStrategy(PaymentChannel channel) { PaymentStrategy strategy strategies.get(channel); if (strategy null) { throw new UnsupportedOperationException( Unsupported payment channel: channel); } return strategy; } }1.4 策略使用Service public class OrderService { private final PaymentStrategyFactory strategyFactory; public OrderService(PaymentStrategyFactory strategyFactory) { this.strategyFactory strategyFactory; } Transactional public PayResult processPayment(Order order) { PaymentStrategy strategy strategyFactory.getStrategy(order.getChannel()); return strategy.pay(order); } }二、折扣计算策略2.1 策略接口public interface DiscountStrategy { BigDecimal calculateDiscount(Order order); int getPriority(); boolean supports(Order order); } Data Builder public class DiscountResult { private BigDecimal originalAmount; private BigDecimal discountAmount; private BigDecimal finalAmount; private String discountType; }2.2 多种折扣策略Component Order(1) public class VipDiscountStrategy implements DiscountStrategy { Override public BigDecimal calculateDiscount(Order order) { if (!supports(order)) { return BigDecimal.ZERO; } // VIP会员享9折 return order.getAmount().multiply(new BigDecimal(0.1)); } Override public int getPriority() { return 1; } Override public boolean supports(Order order) { return VIP.equals(order.getCustomerType()); } } Component Order(2) public class SeasonalDiscountStrategy implements DiscountStrategy { Autowired private DiscountConfig config; Override public BigDecimal calculateDiscount(Order order) { if (!supports(order)) { return BigDecimal.ZERO; } BigDecimal discountRate new BigDecimal( config.getSeasonalDiscountRate()); return order.getAmount().multiply(discountRate); } Override public int getPriority() { return 2; } Override public boolean supports(Order order) { return config.isSeasonalPromotion(); } } Component Order(3) public class CouponDiscountStrategy implements DiscountStrategy { Override public BigDecimal calculateDiscount(Order order) { if (order.getCouponCode() null) { return BigDecimal.ZERO; } Coupon coupon couponService.findByCode(order.getCouponCode()); if (coupon null || !coupon.isValid(order)) { return BigDecimal.ZERO; } return coupon.calculateDiscount(order.getAmount()); } Override public int getPriority() { return 3; } Override public boolean supports(Order order) { return order.getCouponCode() ! null; } }2.3 策略组合Service public class DiscountService { private final ListDiscountStrategy strategies; public DiscountService(ListDiscountStrategy strategies) { // 按优先级排序 this.strategies strategies.stream() .sorted(Comparator.comparingInt(DiscountStrategy::getPriority)) .collect(Collectors.toList()); } public DiscountResult calculateTotalDiscount(Order order) { BigDecimal totalDiscount BigDecimal.ZERO; ListString appliedDiscounts new ArrayList(); BigDecimal remainingAmount order.getAmount(); for (DiscountStrategy strategy : strategies) { if (strategy.supports(order)) { BigDecimal discount strategy.calculateDiscount(order); // 限制折扣不超过剩余金额 discount discount.min(remainingAmount); totalDiscount totalDiscount.add(discount); remainingAmount remainingAmount.subtract(discount); appliedDiscounts.add(strategy.getClass().getSimpleName()); } } return DiscountResult.builder() .originalAmount(order.getAmount()) .discountAmount(totalDiscount) .finalAmount(order.getAmount().subtract(totalDiscount)) .appliedDiscounts(appliedDiscounts) .build(); } }三、工厂模式3.1 简单工厂Service public class MessageSenderFactory { public MessageSender createSender(MessageType type) { switch (type) { case EMAIL: return new EmailSender(); case SMS: return new SmsSender(); case PUSH: return new PushSender(); default: throw new IllegalArgumentException(Unknown type: type); } } }3.2 工厂方法public interface SenderFactory { MessageSender createSender(); } Component public class EmailSenderFactory implements SenderFactory { Override public MessageSender createSender() { return new EmailSender(); } } Component public class SmsSenderFactory implements SenderFactory { Override public MessageSender createSender() { return new SmsSender(); } }3.3 抽象工厂public interface NotificationFactory { MessageSender createMessageSender(); TemplateEngine createTemplateEngine(); NotificationChannel createChannel(); } Component public class EmailNotificationFactory implements NotificationFactory { Override public MessageSender createMessageSender() { return new SmtpSender(); } Override public TemplateEngine createTemplateEngine() { return new FreemarkerEngine(); } Override public NotificationChannel createChannel() { return new EmailChannel(); } }四、策略工厂组合4.1 动态选择Service public class IntegratedPaymentService { private final MapPaymentChannel, PaymentStrategy strategyMap; private final PaymentFactory factory; public IntegratedPaymentService( ListPaymentStrategy strategies, PaymentFactory factory) { this.strategyMap strategies.stream() .collect(Collectors.toMap( PaymentStrategyFactory::detectChannel, Function.identity() )); this.factory factory; } public PaymentResult pay(Order order) { // 根据配置选择策略 PaymentChannel channel order.getChannel(); // 优先使用配置的策略 PaymentStrategy strategy strategyMap.get(channel); // 获取支付网关 PaymentGateway gateway factory.createGateway(channel); // 执行支付 return strategy.pay(order, gateway); } }4.2 策略注册表Service public class StrategyRegistryT { private final MapString, T registry new ConcurrentHashMap(); private final ListStrategyDecoratorT decorators new ArrayList(); public void register(String key, T strategy) { registry.put(key, strategy); } public void registerDecorator(StrategyDecoratorT decorator) { decorators.add(decorator); } public T getStrategy(String key) { T strategy registry.get(key); if (strategy null) { throw new StrategyNotFoundException(key); } // 应用装饰器 for (StrategyDecoratorT decorator : decorators) { strategy decorator.decorate(key, strategy); } return strategy; } }五、实战案例5.1 订单类型处理public interface OrderProcessor { Order process(Order order); } Component public class StandardOrderProcessor implements OrderProcessor { Override public Order process(Order order) { // 标准订单处理逻辑 return order; } } Component public class WholesaleOrderProcessor implements OrderProcessor { Override public Order process(Order order) { // 批发订单特殊处理 validateWholesale(order); applyWholesaleDiscount(order); return order; } } Service public class OrderProcessingService { private final StrategyRegistryOrderProcessor registry; public OrderProcessingService( MapString, OrderProcessor processors) { this.registry new StrategyRegistry(); processors.forEach(registry::register); } public Order processOrder(Order order) { String type order.getType(); OrderProcessor processor registry.getStrategy(type); return processor.process(order); } }5.2 验证策略public interface ValidationStrategyT { ValidationResult validate(T target); } Component public class UserValidationStrategy implements ValidationStrategyUser { Override public ValidationResult validate(User user) { ValidationResult result new ValidationResult(); if (user.getUsername() null || user.getUsername().isEmpty()) { result.addError(username, 用户名不能为空); } if (user.getEmail() ! null !user.getEmail().contains()) { result.addError(email, 邮箱格式不正确); } return result; } } Service public class ValidationService { private final MapClass?, ValidationStrategy? strategies; public ValidationService( MapString, ValidationStrategy? strategyMap) { this.strategies strategyMap.entrySet().stream() .collect(Collectors.toMap( e - e.getKey(), Map.Entry::getValue )); } public T ValidationResult validate(T target) { SuppressWarnings(unchecked) ValidationStrategyT strategy (ValidationStrategyT) strategies.get(target.getClass()); if (strategy null) { return ValidationResult.success(); } return strategy.validate(target); } }六、最佳实践6.1 策略选择使用Primary标注默认策略使用Order或Priority控制执行顺序考虑策略组合而非单一选择。6.2 工厂使用使用Spring的Bean注册工厂方法考虑使用Builder模式简化复杂对象创建保持工厂简单避免业务逻辑。6.3 性能考虑使用缓存策略实例避免在策略中创建大对象考虑策略的懒加载。总结策略模式和工厂模式是解决不同情况使用不同实现问题的利器。通过Spring的依赖注入这些模式的实现更加简洁和可测试。在实际应用中应该根据具体场景选择合适的模式组合遵循开闭原则使系统具有良好的扩展性。