
本文是 Effective Java 第二章的读书笔记,Java使用Builder模式创建对象。
静态工厂和构造器的局限性
面对可能存在多个可选的参数时,不容易扩展。
以构造器为例,通常构建多个参数的对象时,构造器模式使用多个构造器重叠实现。
加入我们需要一个收件人的对象,他的姓名和地址是必填参数,年龄性别假名职业工资等是可选参数,则创建如下对象:
|
|
从代码可以看出,构造器已经太多。如果后期还要加入其他的信息如学历等,估计程序猿要疯掉。。。显然,这样的代码冗长而且不容易拓展。
我们new两个对象出来,并分别调用它们的selfIntroduce()方法:
|
|
控制台的输出结果:
姓名:李逵,地址:梁山,年龄:25,性别:m,称号:黑旋风,职业:杀手,工资:10000.0
姓名:李逵,地址:梁山,年龄:25,性别:m,称号:杀手,职业:黑旋风,工资:10000.0
可以看出,第一条是没问题的,但第二条记录的职业和假名弄反了。
这也是构造器模式的一个弊端:参数很容易弄混掉。
正如作者在书中所说:
重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写,并且仍然较难以阅读。
这种情况可以使用JavaBean模式来改进,不过JavaBean模式会引进其他问题。JavaBean在不同时期状态不一致。
Builder模式
下面是使用Builder模式创建的对象:
|
|
下面new一个对象,并调用selfIntroduce()方法:
|
|
控制台输出如下:
姓名:李逵,地址:梁山,年龄:25,性别:m,称号:黑旋风,职业:杀手,工资:10000.0
显然,这种模式具有良好的可读性,并且当参数增多时很方便扩展。
总结
Builder模式的主要使用场景是:
- 当面对多个属性,且其中有些是可选属性时;
- 对象属性会扩展时。
另外Builder模式的缺点也是很明显的,创建对象前要创建它的Builder,这样会增大系统开销。
最后,举个使用Builder模式创建对象的例子:
|
|
补充:为什么要把成员变量设置成final?
final修饰成员变量时,成员变量一旦初始化以后,不允许修改。从而保证成员变量的值不会被改变。




近期评论