先看3段代码,看了以后就差不多明白了
public class Book { private final String name; //required private final String id; //required private final String value; private final String vendor; private final String vendor2; public Book(String name, String id) { this(name, id, ""); } public Book(String name, String id, String value) { this(name, id, value, ""); } public Book(String name, String id, String value, String vendor) { this(name, id, value, vendor, ""); } public Book(String name, String id, String value, String vendor, String vendor2) { this.name = name; this.id = id; this.value = value; this.vendor = vendor; this.vendor2 = vendor2; } }
以上是一般我们用的构造器,当参数比较多的时候,在使用中就比较麻烦 ,一个是难读,另一个就是传我们不需要的数据,比如:
Book b = new Book("aaa","1","0.0","abc","");
其实book的vendor2 我们并不需要,但是为了构建对象而不得不传这个值,所以这种方式看上去就有点奇怪。
在来看第2种:
public class Book {
private String name; //required
private String id; //required
private String value;
private String vendor;
private String vendor2;
public Book() {
}
public void setName(String name) {
this.name = name;
}
public void setId(String id) {
this.id = id;
}
public void setValue(String value) {
this.value = value;
}
public void setVendor(String vendor) {
this.vendor = vendor;
}
public void setVendor2(String vendor2) {
this.vendor2 = vendor2;
}
}
这种是利用javabean 来创建对象:
Book b = new Book(); b.setName("aaa"); b.setId("12"); b.setValue("0.0"); b.setVendor("ccc");
这种方式也有缺陷 首先类无法通过构造器参数来保证类的一致性,通俗说就是只能靠人力来保证类的统一,保证不少某个参数。而且这种类线程不安全。
第3种才是重点,当类的参数比较多的时候:
public class Book {
private String name; // required
private String id; // required
private String value;
private String vendor;
private String vendor2;
public Book(Builder b) {
this.name = b.name;
this.id = b.id;
this.value = b.value;
this.vendor = b.vendor;
this.vendor2 = b.vendor2;
}
public static class Builder {
private String name; // required
private String id; // required
private String value = "";
private String vendor = "";
private String vendor2 = "";
public Builder(String name, String id) {
this.name = name;
this.id = id;
}
public Builder value(String value) {
this.value = value;
return this;
}
public Builder vendor(String vendor) {
this.vendor = vendor;
return this;
}
public Builder vendor2(String vendor2) {
this.vendor2 = vendor2;
return this;
}
public Book build(){
return new Book(this);
}
}
}
这种写法 可能写的时候代码比较冗长,但是使用起来的效果不错:
Book b = new Book.Builder("aaa", "12").value("0.0").vendor("bbb").build();
这种写法好处很多,首先使用清晰,其次对参数有约束性,builder 可以有多个可变参数,而且一个builder 可以创建多个对象,添加参数比较容易(当项目需要添加参数的时候这种写法很容易添加,构造器的话就要添加新的构造器来为新的属性初始化)
当然有好处也有坏处,这种写法代码冗长,而且在很重视性能的地方 这种方法还是会比构造器需要更多的开销。
总之,如果类的构造器或静态工厂中具有多个参数,设计这个类的时候,Builder模式就是不错的选择。