android——build 模式解析
阿新 • • 發佈:2019-01-12
出現此模式的原因:當我們需要建造一個複雜物件時候,我們需要提高可讀性和方便性的時候,此模式就孕育而生了。
定義:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
程式碼示例:
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的例項物件等等,現在開始,也開始嘗試運用吧。