建造者用于構建復雜的對象,使用戶可以在不知道對象的構建過程和細節(jié)的情況下就可以直接創(chuàng)建復雜的對象。
遇到多個構造器參數(shù)時要考慮使用建造者模式( builder模式 ),相比于重疊器模式和JavaBean模式,用Builder模式構建的對象更利于使用。
以下以Student的構建為例對比以下三種模式,其中Student 的 id 和 name 是必要參數(shù),其它的為非必須參數(shù)。
1.重疊構造器模式
先寫一個包含所有參數(shù)的構造函數(shù),然后在其它構造函數(shù)中填寫默認值去調(diào)用它。
/**
* 重疊構造器模式
*/
public class Student1 {
private int id;
private String name;
private int age;
private String sex;
private String address;
private String nickName;
public Student1(int id, String name, int age, String sex, String address, String nickName) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
this.nickName = nickName;
}
public Student1(int id, String name, int age, String sex, String address) {
this(id, name, age, sex, address, "-");
}
public Student1(int id, String name, int age, String sex) {
this(id, name, age, sex, "-");
}
public Student1(int id, String name, int age) {
this(id, name, age, "未知");
}
public Student1(int id, String name) {
this(id, name, 0);
}
public String toString() {
return this.id + " " + this.name + " " + this.age + " " + this.sex + " " + this.address + " " + this.nickName;
}
}
一旦參數(shù)很多,這種寫法會變得非常的復雜而且難以閱讀,在生成對象的時候,有很多參數(shù)你根本就不想去設置它,但是又不得不設置,所以在構建復雜對象的時候不建議使用這種方法的。
2.JavaBean模式
提供一個只有必要參數(shù)的構造方法,然后通過set方法依次去指定其它非必須參數(shù)。
/**
* JavaBean模式
*/
public class Student2 {
private int id;
private String name;
private int age;
private String sex;
private String address;
private String nickName;
public Student2(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String toString() {
return this.id + " " + this.name + " " + this.age + " " + this.sex + " " + this.address + " " + this.nickName;
}
}
這種方法相對于重疊構造器模式有很大的改進,編寫和使用都比較簡單,也易于閱讀,但是由于構造過程被分到了幾個調(diào)用中,不是一次性完成的,在構造過程中JavaBean可能處于不一致的狀態(tài)。
Student2 student2=new Student2(2,"宇智波佐助");
student2.setAge(16);
student2.setSex("男");
student2.setAddress("木葉忍者村忍者路18號");
student2.setNickName("屌爆你");
3.建造者模式
構建一個和外部類參數(shù)一致的靜態(tài)內(nèi)部類,內(nèi)部類使用類似于JavaBean的構造方法,然后提供一個build方法生成外部類。
/**
* builder 模式
*/
public class Student3 {
//必要參數(shù)
private int id;
private String name;
//非必要參數(shù)
private int age;
private String sex;
private String address;
private String nickName;
public Student3(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.age = builder.age;
this.sex = builder.sex;
this.address = builder.address;
this.nickName = builder.nickName;
}
public static class Builder {
//必要參數(shù)
private int id;
private String name;
//非必要參數(shù)
private int age;
private String sex;
private String address;
private String nickName;
public Builder(int id, String name) {
this.id = id;
this.name = name;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder sex(String sex) {
this.sex = sex;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public Builder nickName(String nickName) {
this.nickName = nickName;
return this;
}
public Student3 build() {
return new Student3(this);
}
}
public String toString() {
return this.id + " " + this.name + " " + this.age + " " + this.sex + " " + this.address + " " + this.nickName;
}
}
這種方式繼承了JavaBean模式的優(yōu)點,又使其構造過程一次性完成了,是對于JavaBean模式的一種改進,構造復雜對象時推薦使用這種模式。
三種構造方法的調(diào)用
public static void main(String args[]){
//1.重疊構造器模式
Student1 student1 =new Student1(1,"漩渦鳴人",15);
Student1 student11 =new Student1(1,"漩渦鳴人",15,"男","-","吊車尾");
//2.JavaBean模式
Student2 student2=new Student2(2,"宇智波佐助");
student2.setAge(16);
student2.setSex("男");
student2.setAddress("木葉忍者村忍者路18號");
student2.setNickName("屌爆你");
//3.Builder模式
Student3 student3=new Student3.Builder(3,"波風水門").age(25).address("天堂村").nickName("火影第一帥").build();
//打印輸出
System.out.println("重疊構造器模式 student:"+student1.toString());
System.out.println("JavaBean模式 student:"+student2.toString());
System.out.println("builder模式 student:"+student3.toString());
}