/*
* 建立對象的Builder模式
* Builder模式隻适合建立對象時需要指定多個可選參數的場景.
* 用戶端:
* 1:在用戶端可以通過下面代碼擷取Person對象
* Person.PersonBuilder builder=new Person.PersonBuilder("111","王大少","男");
* 這裡以選擇可選參數年齡愛好為例子示範;
* Person person=builder.setAge(22).setHobby("reading").build();
*/
public class Person {
/*
* 必要的參數
* 身份證号、姓名、性别
* 聲明為private避免外部不安全的修改
*/
private String id;
private String name;
private String sex;
/*
* 可選參數
* 年齡、電話、愛好、住址、學曆;
*/
private int age;
private String phone;
private String hobby;
private String addr;
private String major;
/*
* Person類私有的構造函數,為什麼要用私有的構造函數?
*/
private Person(PersonBuilder builder)
{
this.id=builder.id;
this.name=builder.name;
this.sex=builder.sex;
this.age=builder.age;
this.phone=builder.phone;
this.hobby=builder.hobby;
this.addr=builder.addr;
this.major=builder.major;
}
/*
* 調用setter,getter方法擷取更改私有成員
*/
public void setId(String id) {
this.id=id;
}
public String getId() {
return id;
}
/*
* 這個PersonBuilder是專門用于建立Person對象的,
* 是以PersonBuilder類從屬于Person類. 是以使用
* 内部類可以清晰的表述這種從屬關系.使用"靜态"
* 内部類則是為了在不存在Person對象時建立PersonBuilder對象
*/
public static class PersonBuilder{
/*
* 必要的參數
* 身份證号、姓名、性别
*/
private String id;
private String name;
private String sex;
/*
* 可選參數
* 年齡、電話、愛好、住址、學曆;
*/
private int age;
private String phone;
private String hobby;
private String addr;
private String major;
/*
* 讓用戶端通過利用所有必要的參數調用構造函數得到一個builder對象
*/
public PersonBuilder(String id,String name,String sex)
{
this.id=id;
this.name=name;
this.sex=sex;
}
/*
* 調用無參的build方法建立Person對象
* 注意,在build方法調用前Person對象都沒有被建立, 是以無需擔心提前洩露的問題
*/
public Person build()
{
return new Person(this);
}
/*
* 調用類似于setter的方法來設定每個相關的可選參數
* 這裡傳回的是PersonBuilder對象,便于用級聯的方式
* 設定可選參數,這樣層次清晰,代碼簡潔
*/
public PersonBuilder setAge(int age) {
this.age = age;
return this;
}
public PersonBuilder setPhone(String phone) {
this.phone = phone;
return this;
}
public PersonBuilder setHobby(String hobby) {
this.hobby = hobby;
return this;
}
public PersonBuilder setAddr(String addr) {
this.addr = addr;
return this;
}
public PersonBuilder setMajor(String major) {
this.major = major;
return this;
}
}
}