Builder模式

tbase發表於2004-03-27

解決問題

以一種更加清晰簡潔的方式來解決複雜結構體的構建過程,且可以讓使用者更加靈活地控制物件的構建過程。相對於constructor和setter方法,它的語法更加簡潔和清晰。

但它所面臨的一個問題是,對於每個類都要寫一個Builder,這無疑增加了寫程式碼的難度。

應用場景

應用於複雜結構體的構建。一個很好的工具是lombok的@Builder

原理圖(UML)

Builder模式
這個原理圖是比較噁心的,採用介面化程式設計實理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();
複製程式碼

Builder模式
參考

https://www.cnblogs.com/cc11001100/p/5939220.html

相關文章