使用Builder模式的三个理由

1.帮助你实现DDD聚合设计

如果创建一个对象的属性是通过使用外部服务实现,这是比较容易,没有任何问题。但是,如果该属性是在创建该对象的同一个方法中来创建,那么就有了问题。在这后一种情况下,作为属性所创建的对象的生命周期通常必须被绑定到“目标”对象的生命周期。也就是两者同生同死。

在这个情况下,Builder构建模式能够帮助你实现DDD的聚合,MF的聚合定义是:

DDD聚合是一系列领域对象被看成一个单个单元。一个例子就是订单和订单条目,这两个都是独立的对象,但是将订单和连同订单条目看成作为一个单一的聚合却是非常有用。

建造者Builder模式可以帮助你将领域模型设计成聚合的方式。这意味着,所有属于该聚合的对象由聚合根对象(订单)创建的,并且可以仅通过聚合根对象来访问。

2.它使你思考

以传统方式写代码很容易,因为你不必去思考。所有您需要做的就是从一个地方到另一个地方拷贝代码。这可能需要一些时间来做到这一点,但它对于你来说不是一个问题,因为你是以一种舒服的方式进行的。

构建模式迫使你去思考你的对象。为了更具体,它迫使你去思考下面的事情:
(1).你要搞清楚一个对象的属性哪些是必须的,哪些是可选的。
(2).你必须识别哪些属性的生命周期必须绑定和父对象的生命周期绑定,生成器Builder模式就是强调了这一特性。
(3).你必须决定哪些属性在创建对象后就不能再被更新(并标记这些属性为final, banq注,实际区分属性对象是实体还是值对象) 。
(4).你必须决定哪些属性可以被更新,并找到更新它们的最好方法。

寻找这些问题的答案会帮助你写出更好的代码。如果你花时间去寻找这些问题的答案,你的代码看起来肯定比写之前靠感觉写出来的要更好。

3.帮助你创建领域语言DSL

你可以将类构造器的参数名称取名与业务相关的名称,当然你可以使用一个setter方法名称里混合业务名词,这些方式都不是很正规。

当你使用Builder模式,你能以DSL方式创建新的对象,生成器的方法名称能够以业务名称命名,这有助于将更多业务意义增加进入代码。

这就提出了一个问题:我怎样才能更新我的对象的属性?你可能觉得这个问题有些无聊,因为你认为可以使用setter方法​​来更新你的对象的个别属性。

但你完全可以做得不同点。取而代之更新单个个别属性,您可以将这些属性转换成有意义的一个群体,然后用一个单一的方法一次性更新这些属性的值。如果你正确地命名这个方法,你可以创建一个DSL来更新现有对象的信息。

最后,请注意,Builder模式不是银弹,Blake Caldwell 认为builder 模式基本是构造器的替代,只是能少范些错误。所以,简单的对象创建还是使用构造器比较合适。

当然本文将Builder模式划定在DDD聚合创建上,应该算是为生成器模式找到了归属,因为一般DDD是针对复杂软件,而聚合根是复杂领域中的一个根实体,为保证聚合边界和生命周期,生成器Builder模式是恰到好处。