《springBoot3使用工厂模式处理业务》
一 业务背景:
// 订单根据不同的操作类型,处理订单数据 OperateType = Integer
1-拣货 PICK
2-复核 CHECK
3-打包 PACK
4-确认 CONFIRM
5-生成发票 GENERATE_INVOICE
二 定义操作策略接口
public interface OrderOperationStrategy {
Integer getOperateType();
SalesOrderVo execute(SalesOrderVo salesOrderVo);
}
三 构建操作策略工厂
@Service
@Slf4j
@RequiredArgsConstructor
public class OrderOperationStrategyFactory {
private final Map<Integer, OrderOperationStrategy> strategyMap;
@Autowired
public OrderOperationStrategyFactory(List<OrderOperationStrategy> strategies) {
strategies.forEach(strategy ->
log.info("注册策略: 类型={}, 实现类={}",
strategy.getOperateType(),
strategy.getClass().getSimpleName())
);
this.strategyMap = strategies.stream()
.collect(Collectors.toMap(
OrderOperationStrategy::getOperateType,
Function.identity(),
(existing, replacement) -> {
log.warn("重复策略类型: {}, 使用{}替代{}",
existing.getOperateType(),
existing.getClass().getSimpleName(),
replacement.getClass().getSimpleName());
return existing;
}
));
}
public OrderOperationStrategy getStrategy(Integer operateType) {
return strategyMap.get(operateType);
}
}
四 业务操作类型 - 实现策略接口
@Service
@Slf4j
@RequiredArgsConstructor
public class PackOperationStrategy implements OrderOperationStrategy{
private final SalesOrderMapper salesOrderMapper;
@Override
public Integer getOperateType() {
return SalesOrderConstants.ORDER_OPERATE_TYPE_PACK;
}
@Override
@Transactional(rollbackFor = Exception.class)
public SalesOrderVo execute(SalesOrderVo salesOrderVo) {
salesOrderVo.setOrderStatus(SalesOrderConstants.ORDER_STATUS_PACK);
if (salesOrderVo.getOrderDirection().equals(SalesOrderConstants.ORDER_DIRECTION_SALES)){
System.out.println("-------------- 业务处理 销售订单打包成功");
} else if (salesOrderVo.getOrderDirection().equals(SalesOrderConstants.ORDER_DIRECTION_RETURN)){
throw new ServiceException("暂不支持的退货打包环节!");
} else {
throw new ServiceException("未知的订单方向!");
}
int res = salesOrderMapper.updateSalesOrder(salesOrderVo);
if (res > 0){
return salesOrderVo;
} else {
throw new ServiceException("打包业务处理失败!");
}
}
}
五 业务中调用
private final OrderOperationStrategyFactory orderOperationStrategyFactory;
@Override
public SalesOrderVo updateByOtherOperate(SalesOrderVo salesOrderVo) {
validateOperation(salesOrderVo);
return Optional.ofNullable(orderOperationStrategyFactory.getStrategy(salesOrderVo.getOperateType()))
.orElseThrow(() -> new ServiceException("未知操作类型"))
.execute(salesOrderVo);
}