Builder模式

什么是Builder模式

相信很多Android開發(fā)者都使用過形如下面的代碼創(chuàng)建過dialog瓶佳。

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Title")
       .setMessage("message")
       .setCancelable(true);
AlertDialog dialog = builder.create();

可以看到一個dialog對象并不是通過new關(guān)鍵字傳參來直接創(chuàng)建,而是通過一個中間變量builder來實現(xiàn)旦袋,通過不斷的對builder設(shè)置參數(shù),最后通過builder的一個方法來完成對對象的創(chuàng)建它改。這就是所謂的builder模式疤孕。

Builder模式的實現(xiàn)思路

因為不能通過new來創(chuàng)建,所以構(gòu)造函數(shù)肯定是私有的央拖,而builder類又要調(diào)用構(gòu)造函數(shù)祭阀,所以builder類一定是要創(chuàng)建的主類的內(nèi)部類鹉戚。除此之外,由于是builder對象返回的主類對象专控,所以builder對象肯定持有一個主類的實例對象抹凳。之后便是各種set方法來對這個對象賦值,最后通過一個公共的方法返回該對象伦腐。

單例的實現(xiàn)方式

public class Product {
    private String attribute1;
    private String attribute2;
    private String attribute3;

    private Product() {

    }

    @Override
    public String toString() {
        return attribute1 + " " + attribute2 + " " + attribute3;
    }

    public static class Builder {
        private Product product = new Product();
        public void setAttribute1(String attribute1) {
            product.attribute1 = attribute1;
        }

        public void setAttribute2(String attribute2) {
            product.attribute2 = attribute2;
        }

        public void setAttribute3(String attribute3) {
            product.attribute3 = attribute3;
        }

        public Product build() {
            return product;
        }
    }
}

我們基本上按照上述思路實現(xiàn)了該代碼赢底,為了一會調(diào)試方便我加了一個toString方法。

可以看到我在這創(chuàng)建了一個product類柏蘑,這個類有三個屬性幸冻,可以是任意類型,為了方便我都給設(shè)置成了string辩越。之后通過內(nèi)部類builder的三個set方法去設(shè)置這三個值嘁扼,通過create方法返回product對象。

在主類中寫如下測試代碼黔攒,可以看到如圖的運行結(jié)果趁啸。

public class Main {
    public static void main(String[] args) {
        Product.Builder builder = new Product.Builder();
        builder.setAttribute1("屬性1");
        builder.setAttribute2("屬性2");
        builder.setAttribute3("屬性3");
        Product product = builder.build();
        System.out.println(product.toString());
    }
}

但是這段代碼比較繁瑣,并沒有實現(xiàn)像最開始介紹時創(chuàng)建dialog時那么方便督惰,我們可以通過對代碼進行修改來改正這個不方便的地方不傅。

修改builder類的代碼,令它的3個set方法都在賦值后返回它自身赏胚,這樣就完成了访娶。

    public static class Builder {
        private Product product = new Product();
        public Builder setAttribute1(String attribute1) {
            product.attribute1 = attribute1;
            return this;
        }

        public Builder setAttribute2(String attribute2) {
            product.attribute2 = attribute2;
            return this;
        }

        public Builder setAttribute3(String attribute3) {
            product.attribute3 = attribute3;
            return this;
        }

        public Product build() {
            return product;
        }
    }

主類測試運行結(jié)果和上面一樣,就不貼圖了觉阅。

        Product.Builder builder = new Product.Builder();
        Product product = builder.setAttribute1("屬性1")
                .setAttribute2("屬性2")
                .setAttribute3("屬性3")
                .build();
        System.out.println(product.toString());

Builder模式的優(yōu)缺點

優(yōu)點

  • 良好的封裝性(調(diào)用者不必知道主類的實現(xiàn)細節(jié)崖疤,只需要對自己關(guān)心的值進行設(shè)置)
  • 容易擴展(增加屬性只需要對builder增加一個對應(yīng)的方法即可)

缺點

  • 作為中間值產(chǎn)生的builder對象會消耗不必要的內(nèi)存
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市典勇,隨后出現(xiàn)的幾起案子劫哼,更是在濱河造成了極大的恐慌,老刑警劉巖割笙,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权烧,死亡現(xiàn)場離奇詭異,居然都是意外死亡伤溉,警方通過查閱死者的電腦和手機般码,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乱顾,“玉大人板祝,你說我怎么就攤上這事∽呔唬” “怎么了扔字?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵囊嘉,是天一觀的道長温技。 經(jīng)常有香客問我革为,道長,這世上最難降的妖魔是什么舵鳞? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任震檩,我火速辦了婚禮,結(jié)果婚禮上蜓堕,老公的妹妹穿的比我還像新娘抛虏。我一直安慰自己,他們只是感情好套才,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布迂猴。 她就那樣靜靜地躺著,像睡著了一般背伴。 火紅的嫁衣襯著肌膚如雪沸毁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天傻寂,我揣著相機與錄音息尺,去河邊找鬼。 笑死疾掰,一個胖子當(dāng)著我的面吹牛搂誉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播静檬,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炭懊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拂檩?” 一聲冷哼從身側(cè)響起侮腹,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎广恢,沒想到半個月后凯旋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡钉迷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年至非,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠聪。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡荒椭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舰蟆,到底是詐尸還是另有隱情趣惠,我是刑警寧澤狸棍,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站味悄,受9級特大地震影響草戈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侍瑟,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一唐片、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涨颜,春花似錦费韭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弹灭,卻和暖如春督暂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲤屡。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工损痰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酒来。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓卢未,卻偏偏與公主長得像,于是被迫代替她去往敵國和親堰汉。 傳聞我的和親對象是個殘疾皇子辽社,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容