解決問題
以一種更加清晰簡潔的方式來解決複雜結構體的構建過程,且可以讓使用者更加靈活地控制物件的構建過程。相對於constructor和setter方法,它的語法更加簡潔和清晰。
但它所面臨的一個問題是,對於每個類都要寫一個Builder,這無疑增加了寫程式碼的難度。
應用場景
應用於複雜結構體的構建。一個很好的工具是lombok的@Builder
原理圖(UML)
這個原理圖是比較噁心的,採用介面化程式設計實理builder, 然後使用一個引導器完成物件的建立。一般情況下,不建議使用該方式(太複雜)示例
我認為該原理圖將builder模式變得很複雜,既然每個類都要寫一個builder,那該builder我們可以將其認為是類的一部分,所以使用內部類會成為一個不錯的方式
public class Student {
private int id;
private String name;
private String passwd;
private String sex;
private String address;
// 構造器儘量縮小範圍
private Student() {
}
// 構造器儘量縮小範圍
private Student(Student origin) {
// 拷貝一份
this.id = origin.id;
this.name = origin.name;
this.passwd = origin.passwd;
this.sex = origin.sex;
this.address = origin.address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPasswd() {
return passwd;
}
public String getSex() {
return sex;
}
public String getAddress() {
return address;
}
/**
* Student的建立完全依靠Student.Builder,使用一種方法鏈的方式來建立
*
*/
public static class Builder {
private Student target;
public Builder() {
target = new Student();
}
public Builder address(int id) {
target.id = id;
return this;
}
public Builder name(String name) {
target.name = name;
return this;
}
public Builder password(String passwd) {
target.passwd = passwd;
return this;
}
public Builder sex(String sex) {
target.sex = sex;
return this;
}
public Builder address(String address) {
target.address = address;
return this;
}
public Student build() {
return new Student(target);
}
}
}
複製程式碼
Student s=new Student.Builder().name("xx").password("****").sex("男").address("北京市朝陽區").build();
複製程式碼
參考
https://www.cnblogs.com/cc11001100/p/5939220.html