领域驱动战术:解密领域工厂(Factory)在复杂聚合根创建中的设计规范
在开展领域驱动设计(DDD)的战术实现时,我们强调将业务逻辑高度内聚到聚合根(Aggregate Root)中,以保护内部状态的一致性。
然而,当一个聚合根的创建过程极其复杂(例如:创建订单聚合时,需要同时生成多条订单明细、计算折后价、初始化支付单,并校验用户授信度),如果在聚合根的构造函数中编写这几百行组装校验代码,会导致聚合根的物理结构变得臃肿不堪,严重违反“单一职责”原则。
为了将**“对象的创建”**与**“对象的使用”**在物理层面彻底解耦,DDD 引入了战术设计组件——**领域工厂(Domain Factory)**。
本文将系统拆解领域工厂的核心职责、准入场景以及标准的工程代码实战。
一、 领域工厂在战术层面的核心职责
传统的构造函数创建对象只适合简单场景。在复杂聚合建模中,领域工厂充当了以下三个关键角色:
| 特征维度 | 构造函数创建 (Constructor) | 领域工厂创建 (Domain Factory) |
|---|---|---|
| 创建复杂度 | 适合简单、扁平化、无复杂深层嵌套的实体创建。 | 适合深层嵌套的复杂聚合树(如 Order 包含多条 Item 实体)。 |
| 规则校验度 | 仅能进行基本的非空校验,不支持多对象联合校验。 | 支持跨多个值对象和实体的联合状态校验。 |
| 基础设施依赖 | 绝对不能依赖外部技术适配器。 | 可有条件地依赖 ID 生成器(如分布式雪崩 ID 服务)。 |
| 生命周期起点 | 实体自身的起点。 | 整个聚合生命周期的起点阀门。 |
二、 领域工厂的两种实战形态:独立工厂 vs. 聚合根内部工厂
在工程落地时,我们通常有两种方式实现领域工厂:
1. 独立工厂类(Factory Service)
当创建过程涉及跨多个聚合的交互(例如:依据 User 聚合和 Promotion 优惠规则聚合来组装生成全新的 Order 聚合),应当编写一个独立的领域工厂类(如 OrderFactory)。
2. 聚合根静态方法(Static Factory Method)
如果创建逻辑相对内聚,仅仅是为了避免外部直接调用 new 导致封装破损,推荐在聚合根内部暴露静态工厂方法(如 Order.create(...)),这是最简单实用的工厂形态。
[ 外部应用服务 (Application Layer) ]
│
▼
1. 调用独立工厂 ──> [ 领域工厂: OrderFactory ] ──> 2. 注入分布式雪崩 ID
│
▼ 3. 跨实体组装与一致性校验
[ 产生崭新的 Order 聚合根 ]
│
▼ 4. 移交应用服务
[ 仓储持久化写入主库 ]
---三、 代码实战:订单聚合根的领域工厂设计
以下是一个严格符合 DDD 规范的“订单领域工厂(OrderFactory)”实现:
1. 领域层:创建订单独立工厂(Domain Layer)
package com.company.domain.factory;
import com.company.domain.aggregate.Order;
import com.company.domain.valobj.*;
import java.util.*;
/**
* 订单领域工厂:高内聚,纯负责复杂聚合树的初始化组装与自检
*/
public class OrderFactory {
/**
* 构建并返回完全合规的订单聚合根
*/
public static Order createOrder(String customerId, List items) {
// 1. 分布式 ID 预先提取生成(模拟雪花算法)
String orderId = "ORD_" + UUID.randomUUID().toString().replace("-", "");
// 2. 初始化聚合根
Order order = new Order(orderId, customerId);
// 3. 循环组装并进行多实体约束校验(高内聚规则)
double total = 0;
for (OrderItemDTO item : items) {
if (item.getQuantity() <= 0) {
throw new IllegalArgumentException("商品数量必须大于零!");
}
order.addItem(item.getProductId(), item.getPrice(), item.getQuantity());
}
// 4. 执行聚合级别的自检(如:限额控制)
if (order.getTotalAmount() > 100000) {
throw new IllegalStateException("单笔订单总额不能超过10万元!");
}
return order;
}
}
2. 应用层:调度工厂完成创建并持久化(Application Layer)
@Service
public class OrderApplicationService {
@Autowired
private OrderRepository orderRepository;
@Transactional
public void submitOrder(SubmitOrderCommand command) {
// 1. 调度领域工厂创建安全无暇的聚合根,隔离 new 关键字
Order order = OrderFactory.createOrder(command.getCustomerId(), command.getItems());
// 2. 调用仓储写入主库
orderRepository.save(order);
}
}
---四、 总结
领域工厂是 DDD 战术建模中把控对象生命周期的第一道关卡。
它通过**将复杂的组装与完整性自检规则从聚合根与应用服务中物理剥离,实现了对象创建职责的高内聚**;并为**分布式 ID 的提取注入提供了合规的技术转换槽**。掌握领域工厂设计规范,是避免系统产生畸形状态、捍卫聚合强一致性边界的核心基石!
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。



暂无评论
还没有人评论过本文,快来发表你的高见吧!