第二条:遇到多个构造器的时候考虑构建器
构造器在遇到多个属性的时候,将采用重叠构造器的模式,会使得客户端代码很难编写,并且非常难以阅读,且容易出错,这是很关键的一点。针对这一点,提出了javabean的模式,通过一个无参构造函数来创建对象,然后通过setter方法来设置每个必要的参数。类似于下面:
//整个对象的雏形已经在第一句代码中创建出来了,不是一次性完成的,下面还有多个set
person p=new person();
p.setAge();
p.setName();
....
但是javabean 模式自身有很严重的缺点,他将整个类的构造过程分到了几个调用中。这就使得类处于不一致的状态()注:我这里的理解是线程方面的问题,没有得过验证
综合第一种方法以及第二种方法的弊端,使用第三种方式,即builder模式。
public class Person {
private final String name;
private int age;
private String address;
public Person(String name){
this.name=name;
}
public Person(builder builder){
this.name=builder.name;
this.age=builder.age;
this.address=builder.address;
}
//Person 的静态内部类builder 成员变量和person一致
public static class builder{
private final String name;
private int age;
private String address;
public builder(String name){
this.name=name;
}
public builder setAge(int age){
this.age=age;
return this;
}
public builder setAddress(String address){
this.address=address;
return this;
}
public Person build(){
return new Person(this);
}
}
}
class test {
//build 即开始构建 ,前面只是设置属性,而Javabean模式则每一步set都是构建的过程。
Person p=new Person.builder("gxx")
.setAddress("Nantong")
.setAge(24)
.build();
}
详细解释看http://blog.youkuaiyun.com/u011240877/article/details/53248917
总结:
builder模式的优点:
1:在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2:每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象。
3:可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4:增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
缺点:
使用Builder模式是肯定会增加代码量的。此外,尽管客户端的代码可读性明显改善,但随之而来的客户端代码变得更加冗长。
Builder会增加个类代码,这也意味着开发者在给类增加属性时有时会忘记给该属性添加支持的builder。
TODO: 选择构造器或者Javabean模式或者静态工厂或者builder模式(问题未解决)
自己总结的一些对比:
1:重叠构造器VSbuilder模式,重叠构造器面临多个属性的时候,将会写很多很多的构造器,而builder模式只需要写相应的属性的setter方法.
2:Builder模式VSJavabean模式:builder模式是一次性的创建整个对象,在还没有调用build方法的时候就不会创建对象,对象的创建是在调用的时候。 而Javabean模式是在一开始new的时候就创建了对象,但是整个对象完整的创建不是一步就完成的,还需要下面的setter方法,这样就会导致对象的不一致问题,也就造成了安全的问题。
3:builder模式VS静态工厂 (待深入理解后解决)