工厂模式(使用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);
    }
}

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

相关推荐
zzb15802 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
必胜刻3 小时前
RESTful 基础:资源、路径与方法对应关系详解
后端·restful
XPoet3 小时前
AI 编程工程化:Hook——AI 每次操作前后的自动检查站
前端·后端·ai编程
J2虾虾4 小时前
在SpringBoot中使用Druid
java·spring boot·后端·druid
程序员小假4 小时前
为什么要有 time _wait 状态,服务端这个状态过多是什么原因?
java·后端
qwert10375 小时前
跨域问题解释及前后端解决方案(SpringBoot)
spring boot·后端·okhttp
90后的晨仔6 小时前
OpenClaw Windows 完整安装指南
后端
IT_陈寒6 小时前
Vue组件复用率提升300%?这5个高阶技巧让你的代码焕然一新!
前端·人工智能·后端
beata7 小时前
Spring Boot基础-2:Spring Boot 3.x 起步依赖(Starter)深度拆解:为什么引入一个依赖就够了?
spring boot·后端
享棣7 小时前
Win11 安装 Nacos 2.0.4 完整版文档 文档说明
后端