根据《设计模式:可重用面向对象软件的元素》一书,:
构建器模式将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。
总的来说,Builder 模式通过提供一种逐步构建对象的方法并提供一种实际返回最终对象的方法来解决大量可选参数和状态不一致的问题。
使用构建器模式,我们有一个构建方法来生成一个不可变的对象。
我的问题:
我可以使用构建器模式,同时在生成的对象的类中保留 setter 方法,从而允许改变构建的对象吗?
如果我生成可变对象,我不应该使用构建器模式?
构建器模式旨在取代所谓的伸缩构造函数(向@scottb致敬)的可选参数,仅此而已。它不要求对象是不可变的。
此外,构建器通常应该仅包含在构建(又名构建)时重要的属性,因此名称为构建器。它不应该包含在对象的生命周期中发生变化但在构造后并不重要的属性。
从概念上讲,如果您有
Child
的构建者,那么唯一重要的三件事是mom
、dad
和childGenes
(男孩/女孩,其他遗传物质)。 孩子的身高或体重不应该成为构建者的一部分,因为它部分由基因驱动,但会因出生时(或“构建”时间)之外的因素而不断变化。
也就是说,除非你真的需要它,否则最好让对象不可变。
希望有帮助!
构建器模式的价值不仅仅是帮助解决伸缩参数问题。
构建器对于构建不可变对象特别有用,因为对于此类对象,必须在构建时提供所有数据。 当需要提供大量数据或必须完成多个步骤时,很容易推荐构建器模式。
没有规定构建器对象不能构建可变对象,但是对于可变对象,JavaBeans 模式以更少的代码提供了相同的好处(易于阅读、自文档化、减少错误倾向)。