工厂模式(使用Spring Bean)和 策略工厂模式 的区别

核心思想区别

  • 工厂模式使用Spring Bean :核心目的还是创建/获取对象 ,只是创建源从new变成了Spring容器。
  • 策略工厂模式 :核心目的是管理和路由已经存在的策略对象到不同的业务逻辑。

代码对比

工厂模式使用Spring Bean

typescript 复制代码
    
@Component
public class PaymentFactory {
    
    @Autowired
    private ApplicationContext applicationContext;
    
    /**
     * 核心:获取支付处理器对象
     * 关注点是"获取哪个对象"
     */
    public PaymentHandler getPaymentHandler(PaymentType type) {
        switch (type) {
            case WECHAT_PAY:
                return applicationContext.getBean(WechatPaymentHandler.class);
            case ALIPAY:
                return applicationContext.getBean(AlipayPaymentHandler.class);
            case BANK_CARD:
                return applicationContext.getBean(BankCardPaymentHandler.class);
            default:
                throw new IllegalArgumentException("不支持的支付类型");
        }
    }
}

// 使用方式:先获取对象,再执行业务
public class PaymentService {
    @Autowired
    private PaymentFactory paymentFactory;
    
    public void processPayment(PaymentRequest request) {
        // 1. 从工厂获取处理器对象
        PaymentHandler handler = paymentFactory.getPaymentHandler(request.getType());
        
        // 2. 使用处理器执行业务
        handler.validate(request);
        handler.pay(request);
        handler.record(request);
    }
}

策略工厂模式

typescript 复制代码
@Component
public class PaymentStrategyFactory {
    private final Map<PaymentType, PaymentStrategy> strategyMap;
    
    @Autowired
    public PaymentStrategyFactory(List<PaymentStrategy> strategies) {
        // Spring启动时自动收集所有策略
        strategyMap = strategies.stream()
            .collect(Collectors.toMap(PaymentStrategy::getType, Function.identity()));
    }
    
    /**
     * 核心:获取策略来执行特定算法
     * 关注点是"执行哪个算法"
     */
    public PaymentStrategy getStrategy(PaymentType type) {
        return strategyMap.get(type);
    }
}

// 使用方式:直接执行策略算法
public class PaymentService {
    @Autowired
    private PaymentStrategyFactory strategyFactory;
    
    public PaymentResult processPayment(PaymentRequest request) {
        // 直接获取策略并执行支付算法
        PaymentStrategy strategy = strategyFactory.getStrategy(request.getType());
        
        // 策略模式通常有统一的算法接口
        return strategy.pay(request.getAmount(), request);
    }
}

关键区别总结

方面 工厂模式使用Spring Bean 策略工厂模式
核心目的 对象创建和获取 算法选择和管理
关注点 "给我一个XX对象" "用XX策略处理这个问题"
方法签名 getXxxHandler() getXxxStrategy()
使用方式 获取对象后调用多个方法 获取策略后调用统一算法方法
接口设计 不同对象接口可能不同 所有策略有统一的算法接口
典型场景 需要不同对象处理完整业务流程 同一问题的不同算法解决方案

如何选择?

使用工厂模式+Spring Bean当:

  • 需要获取不同类型的处理器来处理完整业务流程
  • 不同处理器的方法签名或职责可能不同
  • 关注的是获取合适的对象来完成任务

使用策略工厂模式当:

  • 解决同一问题的不同算法变体
  • 所有策略都有相同的输入输出和职责
  • 关注的是选择和执行特定算法

实际项目中经常共存

java

scss 复制代码
@Service
public class OrderService {
    @Autowired
    private OrderHandlerFactory handlerFactory;      // 工厂模式:获取处理器
    @Autowired
    private PriceStrategyFactory strategyFactory;    // 策略工厂:获取计算策略
    
    public OrderResult createOrder(OrderRequest request) {
        // 工厂模式:获取订单处理器处理完整流程
        OrderHandler handler = handlerFactory.getHandler(request.getOrderType());
        Order order = handler.createOrder(request);
        
        // 策略工厂模式:使用特定策略计算价格
        PriceStrategy priceStrategy = strategyFactory.getStrategy(request.getPriceType());
        BigDecimal finalPrice = priceStrategy.calculate(order);
        order.setFinalPrice(finalPrice);
        
        return handler.completeOrder(order);
    }
}

简单来说:工厂关注"谁来做",策略工厂关注"怎么做"

相关推荐
moxiaoran575322 分钟前
Go语言的错误处理
开发语言·后端·golang
短剑重铸之日6 小时前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
小北方城市网6 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
hanqunfeng7 小时前
(三十三)Redisson 实战
java·spring boot·后端
小北方城市网8 小时前
SpringBoot 集成 MyBatis-Plus 实战(高效 CRUD 与复杂查询):简化数据库操作
java·数据库·人工智能·spring boot·后端·安全·mybatis
hanqunfeng9 小时前
(四十)SpringBoot 集成 Redis
spring boot·redis·后端
小北方城市网9 小时前
SpringBoot 集成 MinIO 实战(对象存储):实现高效文件管理
java·spring boot·redis·分布式·后端·python·缓存
程序员泠零澪回家种桔子10 小时前
RAG自查询:让AI精准检索的秘密武器
人工智能·后端·算法
曹轲恒10 小时前
SpringBoot配置文件(1)
java·spring boot·后端
小北方城市网10 小时前
SpringBoot 安全认证实战(Spring Security + JWT):打造无状态安全接口体系
数据库·spring boot·后端·安全·spring·mybatis·restful