工厂的由来
在平时工作中,如果领域对象的创建逻辑比较简单,那么通过构造器即可创建,如果领域对象的创建逻辑比较复杂的时候,构造器就无法胜任创建的工作了,DDD 中引入了一个新的领域概念来做这个事情:工厂。
领域对象的创建逻辑复不复杂,其实很难判断,一般在 Java 语言,类的构造器参数大于 3 个的时候,再使用构造器创建就不太合适了,这时候我们会新建一个工厂,来创建 Java 类,同理,当领域对象的属性太多,通过构造器一次性创建领域对象时,也会比较复杂,这时候我们可以把复杂的创建工作交给工厂,工厂创建完成后,返回一个完整的领域对象。
注:因为我们的实体是有服务能力的,所以会使用spring,那怎么去创建我们的实体,就需要在实体内部提供工厂方法创建实体。
工厂的场景
工厂有两大场景,一个是用来新建对象,一个是用来重塑对象。
新建对象的场景比较简单,比如房源实体属性太多,有 7、8 个属性,创建的时候需要借助工厂来进行创建。
重塑对象,在 《领域驱动设计:软件核心复杂性应对之道》 中有提过,截图如下:
截图描述比较苦涩,我们举两个例子说明下:
1:我们在和外部公司进行对接的时候,大多数会通过 https 接口进行远程调用,这时我们接受到返回的参数,很可能是个 json 格式,因为依赖不了外部公司的 api 包,json 就不能反序列化成一个 DTO,这时候 json 转化成可使用的对象就比较复杂,我们可以把复杂的转化工作交给工厂,工厂此时的作用就是把 json 格式转化成可直接使用的对象。这种场景在对接基金保险公司时特别常见,基金保险公司的外部接口往往很复杂,字段非常多,这时候转化工作就很繁琐。
2:仓储在查询数据的时候,DO 转化成 VO 的工作也可以交给工厂,这个例子可以在仓储章节查看。
工厂的定义
工厂就是帮助领域对象进行创建和重塑的领域元素。