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

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

相关推荐
q***09806 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
IT_陈寒8 小时前
React 19新特性实战:5个提升开发效率的技巧与避坑指南
前端·人工智能·后端
mzlogin8 小时前
解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题
java·后端·nginx
q***69778 小时前
快速在本地运行SpringBoot项目的流程介绍
java·spring boot·后端
q***42828 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
唐小码9 小时前
Redis RedisTimeSeries 在springboot中的应用
spring boot·redis·后端
回家路上绕了弯9 小时前
高并发订单去重:布隆过滤器过滤已存在订单号的实战方案
分布式·后端
申阳9 小时前
Day 11:集成百度统计以监控站点流量
前端·后端·程序员
Cache技术分享10 小时前
239. Java 集合 - 通过 Set、SortedSet 和 NavigableSet 扩展 Collection 接口
前端·后端
demonre10 小时前
阿里云 Debian 13.1 安装 docker 并切换阿里云镜像源
后端·docker