第11章 工厂
- 第1章 DDD入门
- 第2章 领域、子域和限界上下文
- 第3章 上下文映射图
- 第4章 架构
- 第5章 实体
- 第6章 值对象
- 第7章 领域服务
- 第8章 领域事件
- 第9章 模块
- 第10章 聚合
- 第11章 工厂
- 第12章 资源库
- 第13章 集成限界上下文
- 第14章 应用程序
本章学习路线图
- 学习为什么工厂可以创建具有表达性的、符合通用语言的模型
- 学习SaaSOvation团队是如何将工厂方法作为**聚合(10)**的行为方法的
- 学习如何使用工厂方法来创建其他类型的聚合
- 学习在与其他限界上下文(2)集成并将外部对象翻译成本地对象时,如何将领域服务当做工厂来使用
领域模型中的工厂
工厂应该提供一个创建对象的接口,该接口封装了所有创建对象的复杂操作过程。除了创建对象之外,工厂并不需要承担领域模型中的其他职责。一个含有工厂方法的聚合根的主要职责是完成它的聚合行为,而工厂方法只是其中之一。
另外,在聚合上使用工厂方法也有助于更好地表达通用语言,而这是使用构造函数所不能达到的。
聚合根中的工厂方法
在**聚合(10)**中,我们讨论到了Product上的工厂方法。比如,planBacklogItem()
方法用于创建新的BacklogItem
。书中本章 以多个示例来展现对工厂方法的使用。
这里的工厂方法模式可以不断地重复使用。总的来说,它拥有以下好处:有效地表达限界上下文中的通用语言;减轻客户端在创建新聚合时的负担;确保所创建的实例处于正确的状态。
领域服务中的工厂
SaaSOvation团队提供了协作上下文的另一个例子,用于创建Collaborator实例:
public interface CollaboratorService {
public Author authorFrom(Tenant tenant, String identity);
}
由于继承自抽象类Collaborator的新对象都通过领域服务进行创建,此时的领域服务就扮演了工厂的角色,如下是其中一个的实现:
public Author authorFrom(Tenant tenant, String identity) {
return (Author) UserInRoleAdapter
.newInstance()
.toCollaborator(tenant, identity, "Author", Author.class);
}
通过使用基于领域服务的工厂,我们得以将两个限界上下文的生命周期和概念术语进行分离。更多细节参考集成限界上下文(13)。