实现领域驱动设计-工厂

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

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

那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标识)转换为协作上下文的作者,创建者,支持者和拥有者的概念。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 元模型往往用来在某一特定的领域定义一个基础的通用的语言,来讨论和描述该领域的问题及解决方法。可以将元模型想象成为某...
    数行者阅读 15,990评论 1 7
  • 在开发一个微服务之前,我们要设计微服务。设计微服务和领域驱动设计(DDD)有密切的关系,DDD有助于我们设计微服务...
    书兴阅读 14,890评论 7 40
  • 1. 什么是领域(Domain) 我们所做的软件系统的目的都是来解决一系列问题,例如做一个电商系统来在线销售自己...
    butterfly100阅读 5,463评论 2 27
  • 七弯八拐,在塔合曼安顿下来,闲看云逸山静,喜拍四面环山的塔合曼湿地,幸会简书与黑咔相机,开始学习用简书和黑咔相机,...
    塔合曼阅读 242评论 1 0
  • 料峭春寒,飞雪飘飘,数枝梅花羞来俏; 经冬复历春红梅思雪意难消,意难消,凌寒傲霜,不待百花自先笑; 落雪抱红梅,融...
    风吹十月阅读 205评论 0 1