在领域设计中管理对象的生命周期是至关重要的。本节介绍三种生命周期管理的模式:聚合 Aggregate,工厂模式 Factory,仓储模式 Repository。
聚合通过定义清晰的所属关系和边界,避免混乱、错综复杂的对象关系网来实现模型的内聚。在对象生命周期的开始,使用工厂模式来创建和重建复杂对象,从而封装他们的内部结构。在生命周期的中间和末尾,使用仓储模式来提供查找和检索持久化对象并封装庞大基础设施的手段。
为什么要聚合?
在具有复杂关联的模型中,要想保证对象更改的一致性是很困难的。关联对象之间具有复杂的固定规则,而遵循复杂的规则,会导致各个对象之间的相互干扰,进而导致系统不可用。
解决方式:使用聚合,归类相同业务。
聚合就是把一组业务上关联紧密的对象,圈成一个独立整体,当作数据变更、业务规则校验的最小单元。
每个聚合有两个核心:聚合根 + 聚合边界
边界内定义了聚合的内部都有什么,根则是聚合内部包含的一个特定实体 ENTITY。对聚合而言,外部对象只可以引用根,而边界内部的对象可以互相的引用。

图 1,聚合根定义
图中汽车类 Car 为聚合的根,称之为聚合根,它的边界内包括(Wheel,Tire,Position)。外部的用户 Customer 只能通过聚合根访问边界内部元素。
聚合内部要满足的一些规则:
小结:聚合划出一个范围,在这个范围内,生命周期的每个阶段都必须满足一些固定规则。
2,工厂模式 FACTORY
当创建一个对象或是整个聚合对象时,如果创建工作很复杂,或者暴露了过多的内部结构,则可以使用工厂模式进行封装。
工厂模式 = 专门负责 “造对象” 的方法
它不负责业务逻辑,只干一件事:安全、正确、完整地创建出一个领域对象 / 聚合对象。
工厂模式是一种更加抽象且不与其它对象发生耦合的构造机制,一种负责创建其他对象的程序元素。

图2,工厂模式交互图
比如:创建订单 → 要生成订单号、校验商品、计算价格、初始化状态、关联用户。这种步骤多、规则多的,不能让外面随便 new 订单。
聚合内部有很多子对象,外面不能随便碰。必须通过聚合根的工厂方法统一创建,保证聚合完整。
比如对象构造函数很复杂,有很多私有成员,不想让外部知道。
比如:用户必须满 18 岁才能创建。订单金额不能为负数。一个聚合里不能出现重复数据。这些规则必须在创建时就保证,所以交给工厂方法最安全。
比如:用 “用户” 的数据创建 “订单”,用 “商品” 的数据创建 “订单项”。这种关系紧密的,就在对方类里写工厂方法,逻辑最清晰。
工厂的应用位置:聚合根里面(最常见)和专门的工厂类
下面是具体的一些规则。
好的工厂函数有两个要求:
总结:
工厂模式是什么:专门创建领域对象 / 聚合的方法,保证创建过程安全、正确。
什么时候用:创建复杂、需要校验、属于聚合、不想暴露内部结构。
优势:封装复杂、保证合法、解耦、保护聚合、易维护。
仓储模式:是 DDD 中专门管理领域对象生命周期的设计模式。
为每一个需要全局访问的聚合根,创建一个专属仓储对象,这个对象是该类型所有领域对象在内存中的集合替身,对外提供统一的全局访问接口,完全封装数据库的存储、查询、增删细节,让领域层只关注业务逻辑,不关心数据怎么存、怎么取。

图3,仓储模式交互图
解决业务中的痛点:
仓储模式,一般是提供一个简单的模型,来获取持久化对象并管理聚合根的生命周期。使得应用程序和领域设计与持久化技术解耦。
仓储模式核心使用场景
小结:仓储 = 领域对象的专属管家,只管聚合根,DDD 核心规则,不管理普通实体 / 值对象。对外像内存集合一样用List/Set。对内隐藏所有数据库操作(SQL、ORM、缓存等)。
聚合将业务关联紧密的对象集合为数据修改单元,有聚合根(对外唯一入口)和边界,外部仅能引用聚合根。
场景:对象关联复杂、需统一校验业务规则、需整体增删改的场景。
工厂(含工厂方法)专门负责创建领域对象 / 聚合的组件,封装创建逻辑。
场景:对象 / 聚合创建复杂、需校验规则、需隐藏内部构造、避免外部依赖具体类的场景。
仓储封装聚合根的持久化操作(存取、删除),隔离领域模型与数据访问。
场景:需统一管理聚合根持久化、避免领域层依赖数据层、保证聚合整体存取的场景。
三者协同,工厂负责创建聚合,仓储负责持久化聚合,聚合保证业务规则一致性