設計模式-Builder模式

上一篇文章設計模式-單例模式我們介紹了單例模式的幾種用法和優(yōu)缺點梨树,具體的我們需要結合項目中的場景去具體選擇频鉴。這一篇我們來學習Builder模式(有的翻譯為建造者盼产、構建者),builder模式在Android的開發(fā)場景中用的還是挺多的笼吟,比如Android源碼中的AlertDialog、StringBuilder和StringBuffe等等霸旗,三方庫中的GsonBuilder贷帮、EventBus中的builder等等,太常見了诱告,有的人把鏈式調用和builder設計模式搞混撵枢,其實這兩者是完全不同的,Builder設計模式是設計模式的一種精居,鏈式調用是一種函數(shù)調用方式锄禽。

Builder設計模式:

將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示

上面這句話摘自網(wǎng)絡靴姿,說的比較官方沃但,不懂的人還是一頭霧水。沒關系下面我們來舉例說明Builder設計模式是怎么創(chuàng)建出來的佛吓。
咱們還是拿一個經(jīng)典的Person類來講解宵晚,我們定義一個Person類有姓名、年齡维雇、身高淤刃、體重四個基本的屬性:

public class Person {
    private String name;
    private int age;
    private double height;
    private double weight;

    //為了篇幅省略get、set方法
}

我們可能為了能夠方便的 new 一個對象吱型,定義幾個構造方法:

public Person() {
}

public Person(String name) {
    this.name = name;
}

public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

public Person(String name, int age, double height) {
     this.name = name;
     this.age = age;
     this.height = height;
}

public Person(String name, int age, double height, double weight) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
}

可以看到逸贾,我們定義了幾個構造方法,包括無參津滞、一個參數(shù)铝侵、兩個參數(shù)的等等。
然后我們就可以這樣創(chuàng)建多個Person:

Person p1=new Person();
Person p2=new Person("張三");
Person p3=new Person("李四",18);
Person p4=new Person("王五",21,180);
Person p5=new Person("趙六",17,170,65.4);

但是我們發(fā)現(xiàn)一個問題触徐,參數(shù)一多哟沫,我們根本不清楚參數(shù)代表的具體意義,傳參的時候可能需要點到源碼中查看相關釋義锌介。還有就是當這個類中需要傳入的參數(shù)很多的時候嗜诀,構造方法就會特別多,這樣對我們的開發(fā)和維護是很不利的孔祸,有沒有方法可以解決這個問題呢隆敢?當然,看看我們運用Builder模式是怎么處理這段代碼的:

public class Person {
    private String name;
    private int age;
    private double height;
    private double weight;

    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.height = builder.height;
        this.weight = builder.weight;
    }

    //一大堆get崔慧、set

    static class Builder{
        private String name;
        private int age;
        private double height;
        private double weight;

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

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

        public Builder setHeight(double height){
            this.height = height;
            return this;
        }

        public Builder setWeight(double weight){
            this.weight = weight;
            return this;
        }

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

從上面的代碼我們可以看到:

1.我們創(chuàng)建了一個靜態(tài)的Builder內部類;

2.我們定義了和Person類中一樣的成員變量;

3.Builder中的成員函數(shù)來給這些變量賦值拂蝎,同時返回builder本身;

4.同時提供一個build函數(shù)來創(chuàng)建一個Person對象;

5.在Person對象中存在一個私有的構造函數(shù)來傳入該builder對象依次給Person對象自己的成員變量賦值。

這里有幾點需要說明:

Builder是static修飾的:

靜態(tài)的內部類不持有外部內的引用惶室,如果Builder依賴于外部類温自,那么Builder模式就毫無意義可言玄货;

Person的構造函數(shù)用private修飾:

Person的創(chuàng)建由Builder提供,無需對外暴露悼泌;

關于鏈式調用:

Builder成員函數(shù)返回Builder對象本身松捉,這是為了支持鏈式調用,而鏈式調用是非必需的馆里,使用鏈式調用一般是為了增加易用性和代碼的可讀性隘世。

Builder在Android中的體現(xiàn)

常用的Gson解析創(chuàng)建一個Gson對象斥铺,比如在我的項目中

Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();

多說一句:這里的NullStringToEmptyAdapterFactory是為了解決服務端返回null,客戶端直接處理導致崩潰的情況

其它的還有StringBuilder浦徊、Okhttp、EventBus悬秉、Glide等等营密,有興趣的話可以去看一看她們的源碼械媒。好了,Builder模式我們講完了评汰,接下來的設計模式系列我將來講講工廠模式纷捞,敬請期待。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末键俱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子世分,更是在濱河造成了極大的恐慌编振,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭埋,死亡現(xiàn)場離奇詭異踪央,居然都是意外死亡,警方通過查閱死者的電腦和手機瓢阴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門畅蹂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荣恐,你說我怎么就攤上這事液斜。” “怎么了叠穆?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵少漆,是天一觀的道長。 經(jīng)常有香客問我硼被,道長示损,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任嚷硫,我火速辦了婚禮检访,結果婚禮上始鱼,老公的妹妹穿的比我還像新娘。我一直安慰自己脆贵,他們只是感情好医清,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丹禀,像睡著了一般状勤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上双泪,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天持搜,我揣著相機與錄音,去河邊找鬼焙矛。 笑死葫盼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的村斟。 我是一名探鬼主播贫导,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟆盹!你這毒婦竟也來了孩灯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逾滥,失蹤者是張志新(化名)和其女友劉穎峰档,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寨昙,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讥巡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舔哪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢顷。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捉蚤,靈堂內的尸體忽然破棺而出抬驴,到底是詐尸還是另有隱情,我是刑警寧澤缆巧,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布怎爵,位于F島的核電站,受9級特大地震影響盅蝗,放射性物質發(fā)生泄漏鳖链。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芙委。 院中可真熱鬧逞敷,春花似錦、人聲如沸灌侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侧啼。三九已至牛柒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痊乾,已是汗流浹背皮壁。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哪审,地道東北人蛾魄。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像湿滓,于是被迫代替她去往敵國和親滴须。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容

  • 1.什么是builder模式 簡單解釋叽奥,在程序設計的時候扔水,如果面對的對象屬性較多,對象復雜性比較大(例如對象包...
    DevSiven閱讀 458評論 2 5
  • 之前實現(xiàn)了一個Demo底部彈出框朝氓,是用DialogFragment實現(xiàn)的一個Dialog,雖然實現(xiàn)了鏈式調用魔市,但是...
    飄飄然的影子閱讀 776評論 0 15
  • Retrofit中的Builder模式 1、Retrofit的構造 以上是Retrofit的構造過程(其實在Bui...
    gzfgeh閱讀 545評論 0 0
  • Builder模式可以稱為建造者模式膀篮,它將一個復雜對象的構建和表示分離嘹狞,同樣的構建過程可以創(chuàng)建不同的表示 適用場景...
    KevinLive閱讀 654評論 0 0
  • Builder模式 定義:將一個復雜對象的構建和它的表示分離岂膳,使得同樣的構建過程可以創(chuàng)建不同的表示誓竿。 使用場景:(...
    ping_平閱讀 297評論 0 2