广告
您当前的位置: 首页 >  技术 >  编程开发

领域驱动战术:解密领域工厂(Factory)在复杂聚合根创建中的设计规范

作者:CoderWang 时间:2026-07-04 阅读数:1人阅读

在开展领域驱动设计(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 的提取注入提供了合规的技术转换槽**。掌握领域工厂设计规范,是避免系统产生畸形状态、捍卫聚合强一致性边界的核心基石!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

CoderWang

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信