設計模式-建造者模式

總體說來,建造者模式適合于一個具有較多的零件(屬性)的產品(對象)的創建過程。根據產品創建過程中零件的構造是否具有一致的先后順序,可以將其分為如下兩種形式。

一、通過Client、Director、Builder和Product形成的建造者模式

Builder負責Product類對象的具體過程構建,Director負責指導Build,要求Builder按照其指定的順序去完成Produt的構造。最后通過Builder返回建造后的結果。

簡單地說,就好象我要一座房子住,可是我不知道怎么蓋(簡單的砌墻,層次較低),也不知道怎么樣設計(建幾個房間,幾個門好看,層次較高),于是我需要找一幫民工,他們會砌墻,還得找個設計師,他知道怎么設計,我還要確保民工聽設計師的領導,而設計師本身也不干活,光是下命令,這里砌一堵墻,這里砌一扇門,這樣民工開始建設,最后,我可以向民工要房子了。在這個過程中,設計師是什么也沒有,除了他在腦子里的設計和命令,所以要房子也是跟民工要,記住了!

如果我們需要將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示的意圖時,我們可以使用 Builder模式,又叫生成器模式。如果我們用了Builder模式,那么用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需要知道了。

比如現在我們有一個這樣的使用場景,需要在屏幕上畫小人,人要有頭手腳,要畫不同的人,胖的小人,瘦的小人,矮的小人。按照通常的寫法,會有很多的樣板代碼,畫人的頭,畫人腳手,如果一不小心,非常容易缺胳膊少腿。

二、通過靜態內部類等方式實現的零件無序話構造:

遇到多個構造器參數時要考慮用構建器。靜態工廠和構造器有個共同的局限性:它們都不能很好地擴展到大量的可選參數。

考慮這樣的一個場景:用一個類表示包裝食品外面顯示的營養成分標簽。這些標簽中有幾個域是必需的:每份的含量、每罐的含量以及每份的卡路里,還有超過20個可選域:總脂肪量、飽和脂肪量、轉化脂肪、膽固醇、鈉等等。

程序員一向習慣采用重疊構造器模式,在這種模式下,你提供第一個只有必要參數的構造器,第二個構造器有一個可選參數,第三個有兩個可選參數,以此類推,最后一個構造器包含所有可選參數。重疊構造器模式可行,但是當有許多參數的時候,客戶端代碼會很難編寫,并且仍然難以閱讀。一長串類型相同的參數會導致一些微妙的錯誤。如果客戶端不小心顛倒了其中兩個參數的順序,編譯器也不會出錯,但是程序在運行時會出現錯誤的行為。

public class Client {

public static void main(String[] args) {

User.Builder builder = new User.Builder();

User user = builder.setName("corn").setAge(100).setAddress("廣州").build();}}

class User {

private String name;

private int age;

private String address;

public String getName() {return name;}

public int getAge() {return age;}

public String getAddress() {return address;}

public static class Builder {

private User user = new User();

public Builder setName(String name) {

user.name = name;return this;}

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

public Builder setAddress(String address) {

user.address = address;return this;}

public User build() {return user;}}}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容