[Builder Pattern] 建造者模式

What does Builder Pattern looks like

In Material-Dialog

new MaterialDialog.Builder(this) 
             .title(R.string.title) 
             .content(R.string.content) 
             .positiveText(R.string.agree) 
             .negativeText(R.string.disagree) 
             .show();

In OkHttp

Request request = new Request.Builder() 
                         .url(url) 
                         .post(body) 
                         .build();

Also see in Android Source Code - AlertDialog, Notification...

What is Builder Pattern

The builder pattern is an object creation software design pattern.
首先试伙,建造者(生成器)模式是一種構(gòu)建對象的設(shè)計模式于样。

  • 它可以將復(fù)雜對象的建造過程抽象出來(抽象類別)潘靖,分離對象的表示和構(gòu)建, 使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象糊余。

When use Builder Pattern

When would you use the Builder Pattern? [closed]

The builder pattern is a good choice when designing classes whose constructors or static factories would have more than a handful of parameters.

一般的構(gòu)造方法

  • Telescoping Constructor Pattern
Pizza(int size) { ... } Pizza(int size, boolean cheese) { ... } 
Pizza(int size, boolean cheese, boolean pepperoni) { ... } 
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }
  • parameters limitation
  • difficult to remember required order of the parameters
  • JavaBean Pattern
Pizza pizza = new Pizza(12);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);
  • The problem here is that because the object is created over several calls it may be in an inconsistent state partway through its construction. This also requires a lot of extra effort to ensure thread safety.

The better alternative is to use the Builder Pattern.

How to use Builder Pattern

public class Pizza { 
  private int size; 
  private boolean cheese; 
  private boolean pepperoni; 
  private boolean bacon; 

  private Pizza(Builder builder) { 
    size = builder.size; 
    cheese = builder.cheese; 
    pepperoni = builder.pepperoni; 
    bacon = builder.bacon; 
  }

  public static class Builder { 
    //required 
    private final int size; 
  
    //optional 
    private boolean cheese = false; 
    private boolean pepperoni = false; 
    private boolean bacon = false; 

    public Builder(int size) { 
      this.size = size; 
    } 

    public Builder cheese(boolean value) { 
      cheese = value; 
      return this; 
    } 

    public Builder pepperoni(boolean value) { 
      pepperoni = value; 
      return this; 
    } 

    public Builder bacon(boolean value) { 
      bacon = value; 
      return this; 
   } 

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

  } 
}
  • Because the Builder's setter methods return the Builder object they are able to be chained.
Pizza pizza = new Pizza.Builder(12)
            .cheese(true) 
            .pepperoni(true) 
            .bacon(true) 
            .build();
  • This results in code that is easy to write and very easy to read and understand.
  • This pattern is flexible and it is easy to add more parameters to it in the future.It might be worthwhile in the first place if you suspect you may be adding more parameters in the future.

Conclusion

  • 大量參數(shù)
  • 良好的擴(kuò)展性
  • 通用性
  • 造輪子

Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蘸劈,隨后出現(xiàn)的幾起案子尊沸,更是在濱河造成了極大的恐慌,老刑警劉巖洼专,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁商,死亡現(xiàn)場離奇詭異,居然都是意外死亡棒假,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門谜酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妻枕,“玉大人,你說我怎么就攤上這事述么°堤停” “怎么了度秘?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵剑梳,是天一觀的道長。 經(jīng)常有香客問我垢乙,道長,這世上最難降的妖魔是什么酪刀? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任钮孵,我火速辦了婚禮,結(jié)果婚禮上稠茂,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好诱担,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布蔫仙。 她就那樣靜靜地躺著,像睡著了一般恤煞。 火紅的嫁衣襯著肌膚如雪施籍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音竿裂,去河邊找鬼。 笑死进副,一個胖子當(dāng)著我的面吹牛悔常,可吹牛的內(nèi)容都是我干的给赞。 我是一名探鬼主播鸥昏,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吏垮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唯蝶,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤遗嗽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痹换,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匙姜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年氮昧,在試婚紗的時候發(fā)現(xiàn)自己被綠了浦楣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡振劳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庐杨,到底是詐尸還是另有隱情夹供,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布填渠,位于F島的核電站,受9級特大地震影響氛什,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枪眉,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堡纬。 院中可真熱鬧蒿秦,春花似錦、人聲如沸棍鳖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽医瘫。三九已至,卻和暖如春登下,著一層夾襖步出監(jiān)牢的瞬間叮喳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工畔濒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侵状。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓毅整,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艇潭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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