工厂
工厂即是用来产生对象的地方,将创建复杂对象和聚合的职责分配给一个单独的对象。对于聚合来说,我们应该一次性创建整个聚合,并且确保它的不变条件得到满足。
在DDD中以下对象可以充当工厂
聚合根中的行为方法
例如这篇稳重中的《DDD之如何合理设计一个聚合》
Product对象,planBacklogItem(),scheduleRelease()以及scheduleSprint()方法。我们可以巧妙的将聚合的行为方法设计成工厂方法。
通过实体的工厂方法
比如
public class Forum extend ...{
...
public Discussion startDiscussion(...){
Discussion discussion = new Discussion(
this.tenant,
this.forumId,
...);
...
return discussion;
}
}
这种方式创建对象有如下好处:
1.明确的表达了通用语言
2.startDiscussion只需要传入部分参数,其他的参数可以由Forum提供,减轻了客户端的负担。
3.如果需要更高级别的封装,我们可以将Discussion的构造方法声明成protected。但是想清楚,这样一来,我们创建Discussion对象,必须先获取一个Forum对象。
通过适配器来创建对象
比如我们可以将远程限界上下文中的对象翻译成本地限界上下文中的对象。
public UserAdapter{
@Autowired //远程RPC服务
private UserService userService;
User transferUser(...){
...
//这里我们可以通过MapStruct工具进行转换。
}
}
上一篇:《DDD之领域服务与领域事件》
首篇: 《DDD之通用语言》