建造者模式

建造者用于構建復雜的對象,使用戶可以在不知道對象的構建過程和細節(jié)的情況下就可以直接創(chuàng)建復雜的對象。

遇到多個構造器參數(shù)時要考慮使用建造者模式( builder模式 ),相比于重疊器模式和JavaBean模式,用Builder模式構建的對象更利于使用。

以下以Student的構建為例對比以下三種模式,其中Student 的 id 和 name 是必要參數(shù),其它的為非必須參數(shù)。

1.重疊構造器模式

先寫一個包含所有參數(shù)的構造函數(shù),然后在其它構造函數(shù)中填寫默認值去調(diào)用它。

/**
 * 重疊構造器模式
 */
public class Student1 {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;
    private String nickName;

    public Student1(int id, String name, int age, String sex, String address, String nickName) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
        this.nickName = nickName;
    }

    public Student1(int id, String name, int age, String sex, String address) {
        this(id, name, age, sex, address, "-");
    }

    public Student1(int id, String name, int age, String sex) {
        this(id, name, age, sex, "-");
    }

    public Student1(int id, String name, int age) {
        this(id, name, age, "未知");
    }

    public Student1(int id, String name) {
        this(id, name, 0);
    }

    public String toString() {
        return this.id + "  " + this.name + "  " + this.age + "  " + this.sex + "  " + this.address + "  " + this.nickName;
    }
}

一旦參數(shù)很多,這種寫法會變得非常的復雜而且難以閱讀,在生成對象的時候,有很多參數(shù)你根本就不想去設置它,但是又不得不設置,所以在構建復雜對象的時候不建議使用這種方法的。

2.JavaBean模式

提供一個只有必要參數(shù)的構造方法,然后通過set方法依次去指定其它非必須參數(shù)。

/**
 * JavaBean模式
 */
public class Student2 {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;
    private String nickName;

    public Student2(){}

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String toString() {
        return this.id + "  " + this.name + "  " + this.age + "  " + this.sex + "  " + this.address + "  " + this.nickName;
    }
}

這種方法相對于重疊構造器模式有很大的改進,編寫和使用都比較簡單,也易于閱讀,但是由于構造過程被分到了幾個調(diào)用中,不是一次性完成的,在構造過程中JavaBean可能處于不一致的狀態(tài)。

Student2 student2=new Student2(2,"宇智波佐助");
student2.setAge(16);
student2.setSex("男");
student2.setAddress("木葉忍者村忍者路18號");
student2.setNickName("屌爆你");
3.建造者模式

構建一個和外部類參數(shù)一致的靜態(tài)內(nèi)部類,內(nèi)部類使用類似于JavaBean的構造方法,然后提供一個build方法生成外部類。


/**
 * builder 模式
 */
public class Student3 {
    //必要參數(shù)
    private int id;
    private String name;
    //非必要參數(shù)
    private int age;
    private String sex;
    private String address;
    private String nickName;

    public Student3(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.age = builder.age;
        this.sex = builder.sex;
        this.address = builder.address;
        this.nickName = builder.nickName;
    }

    public static class Builder {
        //必要參數(shù)
        private int id;
        private String name;
        //非必要參數(shù)
        private int age;
        private String sex;
        private String address;
        private String nickName;

        public Builder(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder sex(String sex) {
            this.sex = sex;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public Builder nickName(String nickName) {
            this.nickName = nickName;
            return this;
        }

        public Student3 build() {
            return new Student3(this);
        }
    }

    public String toString() {
        return this.id + "  " + this.name + "  " + this.age + "  " + this.sex + "  " + this.address + "  " + this.nickName;
    }

}

這種方式繼承了JavaBean模式的優(yōu)點,又使其構造過程一次性完成了,是對于JavaBean模式的一種改進,構造復雜對象時推薦使用這種模式。

三種構造方法的調(diào)用
public static void main(String args[]){
    //1.重疊構造器模式
    Student1 student1 =new Student1(1,"漩渦鳴人",15);
    Student1 student11 =new Student1(1,"漩渦鳴人",15,"男","-","吊車尾");

    //2.JavaBean模式
    Student2 student2=new Student2(2,"宇智波佐助");
    student2.setAge(16);
    student2.setSex("男");
    student2.setAddress("木葉忍者村忍者路18號");
    student2.setNickName("屌爆你");

    //3.Builder模式
    Student3 student3=new Student3.Builder(3,"波風水門").age(25).address("天堂村").nickName("火影第一帥").build();

    //打印輸出
    System.out.println("重疊構造器模式 student:"+student1.toString());
    System.out.println("JavaBean模式   student:"+student2.toString());
    System.out.println("builder模式    student:"+student3.toString());
}


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容