实现领域驱动设计-工厂

“工厂应该提供一个创建对象的接口,该接口封装了所有创建对象的复杂操作过程,同时,它并不需要客户去引用那个实际被创建的对象”

其实这个作用跟设计模式的工厂模式是一样的,都是封装对象的复杂创建过程,并且后一句“不需要客户去引用那个实际被创建的对象”即实际创建的对象(实现)由工厂封装,客户只需要引用定义的接口。

那DDD中的工厂有什么不同呢?

除了创建对象之外,工厂并不需要承担领域模型中的其他职责。即DDD中的工厂,也是也仅是创建对象的作用。即从这里意义上看,其实也没什么不同。但DDD中的工厂,既是领域模型,那也应该是通用语言的表达,即工厂方法出现的地方,工厂方法的创建行为都是体现通用语言的。

那工厂用于创建哪种领域对象呢?聚合

在DDD中工厂主要用在什么场景呢?

1.在聚合根中使用工厂方法

2.在领域服务中使用工厂方法

在聚合根中使用工厂方法,是最常见的。如:

public interface Product {

BacklogItem planBacklogItem();

Release scheduleRelease();

Sprint scheduleSprint();

}

在产品product中去计划一个待定项BaklogItem,或去排期一个发布release,或去排期一个冲刺。可以看出,这里的工厂并不单纯体现一个工厂模式,更多是体现通用语言:一个产品是由多个发布和冲刺排期迭代而来的。而很多时候,DDD中工厂也并不会完全体现工厂模式中技术要素,比如抽象工厂,更多是业务的需要。而这里也看出,一般是在一个聚合根中使用工厂方法创建另一个聚合根。

而领域服务中使用工厂呢?领域服务作为工厂,一般是和集成限界上下文相关,简单理解就是领域服务中创建出另一个限界上下文的实体。书中以一个例子作为说明:

public interface CollaboratorService {

public Author authorFrom(Tenant tenant, String identity);

public Creator creatorFrom(Tenant tenant, String identity);

public Moderator moderatorFrom(Tenant tenant, String identity);

public Owner ownerFrom(Tenant tenant, String identity);

}

即该领域服务类将身份与访问上下文的对象翻译成协作上下文中的对象,即在身份和访问上下文中的用户(由tenant和identity标识)转换为协作上下文的作者,创建者,支持者和拥有者的概念。

你可能感兴趣的:(实现领域驱动设计-工厂)