1. 程式人生 > >android——build 模式解析

android——build 模式解析

出現此模式的原因:當我們需要建造一個複雜物件時候,我們需要提高可讀性和方便性的時候,此模式就孕育而生了。

定義:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

程式碼示例:

public class BuildBean {

    public final String name;

    public final String age;


    private BuildBean(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    public String getName() {
        return name;
    }


    public String getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "BuildBean{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public static class Builder{
        private String name;

        private String age;

        public BuildBean.Builder setName(String name){
            this.name = name;
            return this;
        }

        public BuildBean.Builder setAge(String age){
            this.age = age;
            return this;
        }

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

        public Builder(){}
    }

}

個人理解有以下幾個關鍵點:

  • 被構建者BuildBean 的構造方法是私有的——防止使用者通過builder以外的方式建立被構建者;
  • 構建者Builder 的構造方法是public的——給使用者通過builder方式建立被構建者;
  • 被構建者只提供get方法,構建者只提供set方法——這是職責分明的意思,把構建和表達分開;
  • 被構建者的屬性加上final 修飾——這個可加可不加,加了更好,因為被構建者只有私有構造方法;

運用示例:

// 第一中寫法
BuildBean.Builder builder = new BuildBean.Builder();
        builder.setAge("12122");
        builder.setName("sfdsdf");
        BuildBean buildBean = builder.build();

        // 二
        BuildBean buildBean2 = new BuildBean.Builder()
                .setName("adcc")
                .setAge("00")
                .build();

  對於第二種寫法,不能先build 在呼叫build方法,因為build方法返回的是被構建者BuildBean,BuildBean 是沒有set方法的。

build模式核心思想

我們先看一個簡單程式碼

public class GetSelf {

    public GetSelf(){}

    public GetSelf get(){
 // 插入一些其他邏輯
        return this;
    }

    public static void main(String[] args) {
        GetSelf getSelf = new GetSelf();
        System.out.println(getSelf.get().toString());
    }
}

這裡只有一個預設構造方法,和一個get方法返回this;然後測試列印get獲取的物件,執行ok沒有問題。現在我們就想想,這個簡單demo,說明了什麼,其實就是get方法返回的this ,這個this 很神奇,它表示自己,先把自己構建出來,然後通過get方法返回自己,看看前面build ,是不是就是這種思想,有種豁然開朗的感覺,我自己之前一直很疑惑為啥要返回this,這個this又是啥,從哪裡來,怎麼賦值的?

現在知道了,這裡 通過 new BuildBean.Builder() 方法建立構建者本身,然後再一一給屬性賦值,在最後通過build()方法建立被構建者,並把之前的屬性值帶過去通過被構建者的構造方法賦值屬性。

場景運用

build模式在很多地方會用,比如AlertDialog,ImageLoader的options的建立,Okhttp的例項物件,retofit的例項物件等等,現在開始,也開始嘗試運用吧。