天天看點

建立對象之Builder模式

/*
 * 建立對象的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;
		}
        
    }
}