适用场景、要解决的问题:
需要扩展到大量可选参数(4个或以上),如用一个类表示包装食品外面显示的营养成分标签,其中有必需域和大量可选域,大部分情况下某几个可选域中有非零值。
应该规避的做法:
1-重叠构造器模式:
设置很多构造器,第一个构造器只有必要参数、第二个有一个可选参数、第三个有两个可选参数… …将所有情况都包含。虽然可行,但当有许多参数时,使用失去控制,难以阅读、容易出错。
2-JavaBeans模式:
先调用无参构造器来创建对象,再调用setter方法来设置所有的参数。创建实例容易、读起来容易,但是javabeans模式自身有很严重的缺点。构造过程被分到了几个调用中,再构造过程中JavaBean可能处于不一致的状态。除此之外,JavaBeans模式使类没办法做成不可变,需要程序员来控制线程安全。
应该使用的:建造者模式(Builder)。
既有重叠构造器模式的安全性、又有JavaBeans模式很好的可读性。
不直接生成对象,客户端(或静态工厂)利用所有必要参数调用构造器,得到build对象,然后客户端在build对象上调用setter方法设置相关参数。builder设值方法返回builder本身,以便把调用链接起来得到流式的api。
优点++:
也适用于类层次结构。与构造器相比,builder可以有多个可变参数。因为builder是利用单独方法来设置每个参数。可以多次调用某个方法实现将每次传入的参数集中到一个域中。