代碼
package cn.test;
public class Test {
public static void main(String[] args) {
//不使用構(gòu)建者
Person person = new Person();
System.out.println("設置field1之前有非常復雜的邏輯");
person.setField1("name");
System.out.println("設置field2之前有非常復雜的邏輯");
person.setField2("age");
System.out.println("設置field3之前有非常復雜的邏輯");
person.setField3("gender");
System.out.println(person);
System.out.println("-------------------------------");
//使用構(gòu)建者
Person person1 = new PersonConcrete(new Person())
.setField1("name")
.setField2("age")
.setField3("gender")
.build();
System.out.println(person1);
}
}
class Person {
private String field1;
private String field2;
private String field3;
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField3() {
return field3;
}
public void setField3(String field3) {
this.field3 = field3;
}
@Override
public String toString() {
return "Person{" +
"field1='" + field1 + '\'' +
", field2='" + field2 + '\'' +
", field3='" + field3 + '\'' +
'}';
}
}
interface Builder {
Builder setField1(String filed1);
Builder setField2(String filed2);
Builder setField3(String filed3);
Person build();
}
class PersonConcrete implements Builder {
private Person person;
public PersonConcrete(Person person) {
this.person = person;
}
@Override
public Builder setField1(String filed1) {
System.out.println("設置field1之前有非常復雜的邏輯");
person.setField1(filed1);
return this;
}
@Override
public Builder setField2(String filed2) {
System.out.println("設置field2之前有非常復雜的邏輯");
person.setField2(filed2);
return this;
}
@Override
public Builder setField3(String filed3) {
System.out.println("設置field3之前有非常復雜的邏輯");
person.setField3(filed3);
return this;
}
@Override
public Person build() {
return person;
}
}
輸出
設置field1之前有非常復雜的邏輯
設置field2之前有非常復雜的邏輯
設置field3之前有非常復雜的邏輯
Person{field1='name', field2='age', field3='gender'}
-------------------------------
設置field1之前有非常復雜的邏輯
設置field2之前有非常復雜的邏輯
設置field3之前有非常復雜的邏輯
Person{field1='name', field2='age', field3='gender'}
Process finished with exit code 0
總結(jié)
構(gòu)建者模式將構(gòu)建復雜對象的邏輯剝離開來,放在單獨的實現(xiàn)了builder接口的concrete類里來執(zhí)行,外部實例化的時候通過鏈式調(diào)用來獲得對象.
該模式的主要優(yōu)點如下:
- 各個具體的建造者相互獨立,有利于系統(tǒng)的擴展.
- 例子中用PersonConcrete類來構(gòu)建實例,也可以再創(chuàng)建新的StudentConcrete類來構(gòu)建另一個指定的實例
- 客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),便于控制細節(jié)風險.
- 客戶端通過鏈式調(diào)用,不需要內(nèi)部組成的細節(jié)
其缺點如下:
- 產(chǎn)品的組成部分必須相同普碎,這限制了其使用范圍
- 上例中必須有3個屬性field1,field2,field3.
- 如果產(chǎn)品的內(nèi)部變化復雜,該模式會增加很多的建造者類