針對建構一個對象時,該對象有多個屬性,建構比較複雜,容易出錯 ,且如果直接用構造方法建構的話,為了保證多種需求,有的參數不需要傳,有的需要傳,一共有10個屬性,你需要無參構造、一個參數的構造方法、兩個參數的構造方法...一堆構造方法。
為了解決這個問題,可以使用建造者模式。
package creational.builder;
public class Person {
int id;
String name;
int age;
double weight;
int score;
Location loc;
private Person() {}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", weight=" + weight +
", score=" + score +
", loc=" + loc +
'}';
}
public static class PersonBuilder {
Person p = new Person();
public PersonBuilder basicInfo(int id, String name, int age) {
p.id = id;
p.name = name;
p.age = age;
return this;
}
public PersonBuilder weight(double weight) {
p.weight = weight;
return this;
}
public PersonBuilder score(int score) {
p.score = score;
return this;
}
public PersonBuilder loc(String street, String roomNo) {
p.loc = new Location(street, roomNo);
return this;
}
public Person build() {
return p;
}
}
}
package creational.builder;
public class Main {
public static void main(String[] args) {
Person p = new Person.PersonBuilder()
.basicInfo(1, "zhangsan", 18)
//.score(20)
.weight(200)
//.loc("bj", "23")
.build();
System.out.println(p.toString());
}
}
以上代碼可以看到,先基于Bulider對象進行初始化指派完善,完成後,調用build()方法,得到最終的要建構的對象。
https://github.com/phs999/DesignPatterns/tree/c6cc68d93db4c096b8362ad2e48f188760c3c167/design_pattern/src/creational/builder