DDD 聚合根 + 工厂模式:你的领域建模为什么一改就崩
我之前接手过一个订单系统,4 个开发一起写的,跑了 2 年。某天产品说"加个拼团功能",我看着代码结构,改了 23 个文件才把一个简单的"拼团订单"塞进去。
复盘时老板问我为什么这么慢。我指着代码说:"这不是订单系统,是一坨面条。"
整个订单系统里,没有聚合根、没有工厂、没有领域事件,全是 Service 层堆业务逻辑。Service 调 Service,方法套方法,500 行的OrderService.createOrder()是常事。
这种代码的根本问题不是"烂",是设计模式的彻底缺位。本文用一个真实的订单中心重构案例,讲清楚 DDD 聚合根 + 工厂模式怎么落地。
你写的不是订单中心,是数据库的搬运工
先看你大概率写过的代码:
```java @Service public class OrderService { @Autowired private OrderRepository orderRepository; @Autowired private OrderItemRepository itemRepository; @Autowired private StockService stockService; @Autowired private CouponService couponService; @Autowired private PaymentService paymentService; @Autowired private UserService userService;
public Long createOrder(CreateOrderRequest req) { // 1. 校验用户 User user = userService.getById(req.getUserId()); if (user == null) throw new RuntimeException("用户不存在"); // 2. 校验库存 for (OrderItemDTO item : req.getItems()) { Stock stock = stockService.getBySkuId(item.getSkuId()); if (stock.getCount() < item.getCount()) { throw new RuntimeException("库存不足"); } } // 3. 校验优惠券 if (req.getCouponId() != null) { Coupon coupon = couponService.getById(req.getCouponId()); if (!coupon.isValid()) throw new RuntimeException("优惠券无效"); } // 4. 算价格 BigDecimal totalPrice = BigDecimal.ZERO; for (OrderItemDTO item : req.getItems()) { Product product = productService.getById(item.getSkuId()); totalPrice = totalPrice.add(product.getPrice().multiply(BigDecimal.valueOf(item.getCount()))); } if (req.getCouponId() != null) { totalPrice = couponService.applyDiscount(req.getCouponId(), totalPrice); } // 5. 扣库存 for (OrderItemDTO item : req.getItems()) { stockService.decrease(item.getSkuId(), item.getCount()); } // 6. 创建订单 Order order = new Order(); or