遇到多个构造器参数时要考虑用构建器

2019-03-09  本文已影响0人  Aluha_f289

静态工厂和构造器有个共同的局限性:他们都不能很好地扩展到大量的可选参数。
考虑用一个类表示包装食品外面显示的营养成份标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里,还有超过20个可选域:总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。大多数产品在某几个可选域中都会有非零的值。

1、重叠构造器(不可选)
image.png
想要创建实例的时候
image.png
重叠构造器模式可行,但是有很多参数的时候,客户端代码会很难编写,并且仍然较难以阅读。如果客户端不小心颠倒了其中两个参数的顺序,编译器也不会出错,但是程序在运行时会出现错误的行为。

2、##### javaBean模式(不可选)
遇到许多构造器参数的时候,还有第二种代替办法,即JavaBeans模式,在这种模式下,调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,及每个相关的可选参数:

image.png
遗憾的是,JavaBeans模式自身有着很严重的缺点。因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来呆证一致性。试图使用处于不一致状态的对象,将会导致失败,这种失败与包含错误的代码相径庭,因此它调试起来十分困难。
3、Builder模式(可选)

不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的bui尾方法来生成不可变的对象。这个builder是它构建的类的静态成员类(见第22条).下面就是它的示例:


image.png

实例化
**NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).
calories(100).sodium(35).carbohydrate(27).build();

上一篇下一篇

猜你喜欢

热点阅读