設計模式系列(四)建造者模式Builder

2021-07-14 01:09:08 字數 2193 閱讀 1582

設計模式系列(三)工廠模式 一文中,介紹了工廠方法模式和抽象工廠模式。本文主要介紹builder設計模式

在軟體系統中,有時候面臨著「乙個複雜物件」的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法確相對穩定。如何應對這種變化?如何提供一種「封裝機制」來隔離出「複雜物件的各個部分」的變化,從而保持系統中的「穩定構建演算法」不隨著需求改變而改變?這就是要說的建造者模式。

建造者模式可以將乙個產品的內部表象與產品的生成過程分割開來,從而可以使乙個建造過程生成具有不同的內部表象的產品物件。

物件性質的建造

有些情況下,乙個物件會有一些重要的性質,在它們沒有恰當的值之前,物件不能作為乙個完整的產品使用。比如,乙個電子郵件有發件人位址、收件人位址、主題、內容、附錄等部分,而在最起碼的收件人位址未被賦值之前,這個電子郵件不能發出。

有些情況下,乙個物件的一些性質必須按照某個順序賦值才有意義。在某個性質沒有賦值之前,另乙個性質則無法賦值。這些情況使得性質本身的建造涉及到複雜的商業邏輯。

這時候,此物件相當於乙個有待建造的產品,而物件的這些性質相當於產品的零件,建造產品的過程就是組合零件的過程。由於組合零件的過程很複雜,因此,這些"零件"的組合過程往往被"外部化"到乙個稱作建造者的物件裡,建造者返還給客戶端的是乙個全部零件都建造完畢的產品物件。

之所以使用"建造者"而沒有用"生成器"就是因為用零件生產產品,"建造"更為合適,"建立"或"生成"不太恰當。

建造者模式將乙個複雜物件的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。

builder:為建立product物件的各個部件指定抽象介面。

concretebuilder:實現builder的介面以構造和裝配該產品的各個部件,定義並明確它所建立的表示,並提供乙個檢索產品的介面。

director:構造乙個使用builer介面的物件。

product:表示被構造的複雜物件。concretebuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,以及將這些部件裝配成最終產品的介面。

1、建造者模式的「加工工藝」是暴露的,這樣使得建造者模式更加靈活。

2、解耦了組裝過程和建立具體部件,使得我們不用去關心每個部件是如何組裝的。--上面對自行車的分析可以很清楚的看出這點。

上面的第1點優點也可以說是建造者模式的缺點,因為「加工工藝」的暴露,使此模式不太「優雅」。

1、需要生成的產品物件有複雜的內部結構。

2、需要生成的產品物件的屬性相互依賴,建造者模式可以強迫生成順序。

3、在物件建立過程中會使用到系統中的一些其它物件,這些物件在產品物件的建立過程中不易得到。

1、建造者模式主要用於「分步驟構建乙個複雜的物件」,在這其中「分步驟」是乙個穩定的演算法,而複雜物件的各個部分則經常變化。

2、產品不需要抽象類,特別是由於建立物件的演算法複雜而導致使用此模式的情況下或者此模式應用於產品的生成過程,其最終結果可能差異很大,不大可能提煉出乙個抽象產品類。

3、建立者中的建立子部件的介面方法不是抽象方法而是空方法,不進行任何操作,具體的建立者只需要覆蓋需要的方法就可以,但是這也不是絕對的,特別是類似文字轉換這種情況下,預設的方法將輸入原封不動的輸出是合理的預設操作。

4、前面我們說過的抽象工廠模式(abtract factory)解決「系列物件」的需求變化,builder模式解決「物件部分」的需求變化,建造者模式常和組合模式(composite pattern)結合使用。

在android原始碼中,我們最常用到的builder模式就是alertdialog.builder

建立notifaciton也是使用builder方法

package com.designpattern.builder;

/** * 建立者模式

設計模式 四 建造者模式

目錄 前言 1 為什麼要用建造者模式 2 建造者模式怎麼用 3 工廠模式和建造者模式 4 結語 學會了建造者模式之後可能有的朋友疑問更深了,為啥我不能用工廠模式來解決呢,我把建立的 抽取到工廠中去,然後根據客戶端的選擇直接建立產品不就行了嗎?建造者模式是建立型模式中比較特別的乙個模式,但特別只是你主...

設計模式(四)建造者模式

奇怪,我怎麼感覺我寫過這個東西。好吧,我翻了一下,沒有寫。這個東西,和工廠模式差不多。差別在於 工廠模式是生產不同的物件。構建者相當於,選擇不同型號的配件來組裝成品。我突然記起來了,我真的沒有寫過這個東西。是以前看書的時候做過筆記而已。一,設定部件 典型的場景,比如qq秀裝備。設定衣服,帽帽,褲褲,...

PHP設計模式系列 建造者模式

有乙個使用者的userinfo類,建立這個類,需要建立使用者的姓名,年齡,金錢等資訊,才能獲得使用者具體的資訊結果。建立乙個userinfobuilder 使用者建造者類,這個類,將userinfo複雜的建立姓名,年齡,金錢等操作封裝起來,簡化使用者類的建立過程 建造者模式,目的是消除其它物件複雜的...