本文共 991 字,大约阅读时间需要 3 分钟。
参考:Effective Java 第二版 第二章
静态工厂和构造器有个共同的局限,都能很好地扩展到大量的可选参数。
重叠构造器模式可行,但是当有许多参数时,客户端代码会很难编写,并且难以阅读。也可以用JavaBeans莫斯。这种模式中,调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数。但是,JavaBeans莫斯的缺点在于构造过程被分到了几个调用中,在构造过程中,JavaBean可能处于不一致的状态。同时JavaBeans模式阻止了把类做成不可变的可能。需要程序员付出额外的努力来确保它的线程安全。
还有一种方式是Builder模式,不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后客户端调用无参的build方法来生成不可变的对象。这个builder是塔构建的类的静态成员类。
所有的默认参数值都单独放在一个地方。builder的setter方法返回builder本身,以便可以把调用链连接起来。
这样的客户端代码很容易编写,更为重要的是,易于阅读。builder模式模拟了具名的可选参数。
builder像个构造器一样,可以对其参数强加约束条件。builder方法可以检验这些约束条件。将参数从builder拷贝到对象之中后,并在对象域而不是builder域中对它们进行检验,这一点很重要。
与构造器相比,builder的略微优势在于,builder可以有多个可变参数。构造器就像方法一样,只能有一个可变参数。因为builder利用单独的方法来设置每个参数。
Builder模式十分灵活,可以利用单个builder构建多个对象。builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变。builder可以自动填充某些域。
Builder模式自身的不足在于,为了创建对象,必须先创建它的构建器。虽然创建构建器的开销在实践中可能不那么明显,但是在某些十分注重性能的情况下,可能就成问题了。Builder模式比重叠构造器模式更加冗长,因此,它只在有很多参数的情况下使用。
如果类的构造器或者静态工厂中有多个参数,设计这种类时Builder模式就是种不错的选择。
转载地址:http://mgyai.baihongyu.com/