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

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

相关推荐
全栈老石18 分钟前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
space621232726 分钟前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
Tony Bai1 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
寻找奶酪的mouse2 小时前
30岁技术人对职业和生活的思考
前端·后端·年终总结
梦想很大很大2 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
毅炼2 小时前
Java 基础常见问题总结(4)
java·后端
想用offer打牌2 小时前
MCP (Model Context Protocol) 技术理解 - 第一篇
后端·aigc·mcp
千寻girling2 小时前
Koa.js 教程 | 一份不可多得的 Node.js 的 Web 框架 Koa.js 教程
前端·后端·面试
程序员清风2 小时前
北京回长沙了,简单谈谈感受!
java·后端·面试
何中应3 小时前
请求头设置没有生效
java·后端