6 生成器模式 builder

2022-07-16 04:12:09 字數 4530 閱讀 1571

​ 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

builder:​ 生成器介面,定義建立乙個product物件所需的各個部件的操作。

concretebuilder:​ 具體的生成器實現,實現各個部件的建立,並負責組裝product物件的各個部件,同時還提供乙個讓使用者獲取組裝完成後的產品物件的方法。

director:​ 指導者,也被稱為導向者,主要用來使用builder介面,以乙個統一的過程來構建所需要的product物件

product:​ 產品,表示被生成器構建的複雜物件,包含多個部件。

繼續匯出資料的應用框架對於匯出資料的應用框架,通常對於具體的匯出內容和格式是有要求的,假如現在有如下的要求,簡單描述一下:

(1)匯出的檔案,不管什麼格式,都分成三個部分,分別是檔案頭、檔案體和檔案尾

(2)在檔案頭部分,需要描述如下資訊:分公司或門市點編號、匯出資料的日期,對於文字格式,中間用逗號分隔

(3)在檔案體部分,需要描述如下資訊:表名稱、然後分條描述資料。對於文字格式,表名稱單獨佔一行,資料描述一行算一條資料,欄位間用逗號分隔。

(4)在檔案尾部分,需要描述如下資訊:輸出人現在就要來實現上述功能。為了演示簡單點,在工廠方法模式裡面已經實現的功能,這裡就不去重複了,這裡只關心如何實現匯出檔案,而且只實現匯出成文字格式和xml格式就可以了,其它的就不去考慮了。

不用模式的解決方案--看**存在的問題對於不同的輸出格式,處理步驟是一樣的,但是具體每步的實現是不一樣的。

(1)先拼接檔案頭的內容

(2)然後拼接檔案體的內容

(3)再拼接檔案尾的內容

(4)最後把拼接好的內容輸出出去成為檔案按照現在的實現方式,就存在如下的問題:

(1)構建每種輸出格式的檔案內容的時候,都會重複這幾個處理步驟,應該提煉出來,形成公共的處理過程

(2)今後可能會有很多不同輸出格式的要求,這就需要在處理過程不變的情況下,能方便的切換不同的輸出格式的處理​ 換句話說,也就是構建每種格式的資料檔案的處理過程,應該和具體的步驟實現分開,這樣就能夠復用處理過程,而且能很容易的切換不同的輸出格式。假設:xx客戶要求表頭和表尾的位置互換,那麼不同輸出格式的邏輯都得修改,改動量大。

使用模式的解決方案

1:生成器模式的功能​ 生成器模式的主要功能不僅僅是構建複雜的產品,而且是細化的,分步驟的構建產品,也就是生成器模式重在解決一步一步構造複雜物件的問題。如果光是這麼認識生成器模式的功能是不夠的。

​ 更為重要的是,這個構建的過程是統一的,固定不變的,變化的部分放到生成器部分了,只要配置不同的生成器,那麼同樣的構建過程,就能構建出不同的產品表示來。

​ 直白點說,生成器模式的重心在於分離構建演算法和具體的構造實現,從而使得構建演算法可以重用,具體的構造實現可以很方便的擴充套件和切換,從而可以靈活的組合來構造出不同的產品物件。

2:生成器模式的構成要特別注意,生成器模式分成兩個很重要的部分:

(1)乙個部分是builder介面這邊,這邊是定義了如何構建各個部件,也就是知道每個部件功能如何實現,以及如何裝配這些部件到產品中去;

(2)另外乙個部分是director這邊,director是知道如何組合來構建產品,也就是說director負責整體的構建演算法,而且通常是分步驟的來執行。

​ 不管如何變化,builder模式都存在這麼兩個部分,乙個部分是部件構造和產品裝配,另乙個部分是整體構建的演算法。認識這點是很重要的,因為在生成器模式中,強調的是固定整體構建的演算法,而靈活擴充套件和切換部件的具體構造和產品裝配的方式,所以要嚴格區分這兩個部分。​ 在director實現整體構建演算法的時候,遇到需要建立和組合具體部件的時候,就會把這些功能通過委託,交給builder去完成

3:生成器模式的使用​ 應用生成器模式的時候,可以讓客戶端創造director,在director裡面封裝整體構建演算法,然後讓director去呼叫builder,讓builder來封裝具體部件的構建功能,這就跟前面的例子一樣。​ 還有一種退化的情況,就是讓客戶端和director融合起來,讓客戶端直接去操作builder,就好像是指導者自己想要給自己構建產品一樣。(**)

4:生成器模式的呼叫順序示意圖

(1)生成器的實現​ 實際上在builder介面的實現中,每個部件構建的方法裡面,除了部件裝配外,也可以實現如何具體的建立各個部件物件,也就是說每個方法都可以有兩部分功能,乙個是建立部件物件,乙個是組裝部件。​ 在構建部件的方法裡面可以實現選擇並建立具體的部件物件,然後再把這個部件物件組裝到產品物件中去,這樣一來,builder就可以和工廠方法配合使用了。

​ 再進一步,如果在實現builder的時候,只有建立物件的功能,而沒有組裝的功能,那麼這個時候的builder實現跟抽象工廠的實現是類似的。​ 這種情況下,builder介面就類似於抽象工廠的介面,builder的具體實現就類似於具體的工廠,而且builder介面裡面定義的建立各個部件的方法也是有關聯的,這些方法是構建乙個複雜物件所需要的部件物件。

(2)指導者的實現​ 在生成器模式裡面,指導者承擔的是整體構建演算法部分,是相對不變的部分。因此在實現指導者的時候,把變化的部分分離出去是很重要的。​ 其實指導者分離出去的變化部分,就到了生成器那邊,指導者知道整體的構建演算法,就是不知道如何具體的建立和裝配部件物件。因此真正的指導者實現,並不僅僅是如同前面示例那樣,簡單的按照一定順序呼叫生成器的方法來生成物件,並沒有這麼簡單。應該是有較為複雜的演算法和運算過程,在運算過程中根據需要,才會呼叫生成器的方法來生成部件物件。

(3)指導者和生成器的互動​ 在生成器模式裡面,指導者和生成器的互動,是通過生成器的那些buildpart方法來完成的。指導者通常會實現比較複雜的演算法或者是運算過程,在實際中很可能會有這樣的情況:​ a:在執行指導者的時候,會按照整體構建演算法的步驟進行運算,可能先執行前幾步運算,到了某一步驟,需要具體建立某個部件物件了,然後就呼叫builder中建立相應部件的方法來建立具體的部件。同時,把前面運算得到的資料傳遞給builder,因為在builder內部實現建立和組裝部件的時候,可能會需要這些資料

​ b:builder建立完具體的部件物件後,會把建立好的部件物件返回給指導者,指導者繼續後續的演算法運算,可能會用到已經建立好的物件​ c:如此反覆下去,直到整個構建演算法執行完成,那麼最終的產品物件也就建立好了​ 通過上面的描述,可以看出指導者和生成器是需要互動的,方式就是通過生成器方法的引數和返回值,來回的傳遞資料。事實上,指導者是通過委託的方式來把功能交給生成器去完成

(4)返回裝配好的產品的方法​ 在標準的生成器模式裡面,在builder實現裡面會提供乙個返回裝配好的產品的方法,在builder介面上是沒有的。它考慮的是最終的物件一定要通過部件構建和裝配,才算真正建立了,而具體幹活的就是這個builder實現,雖然指導者也參與了,但是指導者是不負責具體的部件建立和組裝的,因此客戶端是從builder實現裡面獲取最終裝配好的產品。

(5)關於被構建的產品的介面​ 在使用生成器模式的時候,大多數情況下是不知道最終構建出來的產品是什麼樣的,所以在標準的生成器模式裡面,一般是不需要對產品定義抽象介面的,因為最終構造的產品千差萬別,給這些產品定義公共介面幾乎是沒有意義的。

1:鬆散耦合

2:可以很容易的改變產品的內部表示

3:更好的復用性

首先,生成器模式的封裝性很好。使用生成器模式可以有效的封裝變化,在使用生成器模式的場景中,一般product類和builder類是比較穩定的,因此,將主要的業務邏輯封裝在director類中對整體而言可以取得比較好的穩定性。

其次,生成器模式很容易進行擴充套件。如果有新的需求,通過實現乙個新的生成器類就可以完成,基本上不用修改之前已經測試通過的**,因此也就不會對原有功能引入風險。

生成器模式與工廠模式的區別

​ 我們可以看到,生成器模式與工廠模式是極為相似的,總體上,生成器模式僅僅只比工廠模式多了乙個「導演類」的角色。在生成器模式的類圖中,假如把這個director類看做是最終呼叫的客戶端,那麼圖中剩餘的部分就可以看作是乙個簡單的工廠模式了。

​ 與工廠模式相比,生成器模式一般用來建立更為複雜的物件,因為物件的建立過程更為複雜,因此將物件的建立過程獨立出來組成乙個新的類——director類。也就是說,工廠模式是將物件的全部建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而生成器模式中,builder類一般只提供產品類中各個元件的建造,而將具體建造過程交付給director類。由director類負責將各個元件按照特定的規則組建為產品,然後將組建好的產品交付給客戶端。

生成器模式的本質是:分離整體構建演算法和部件構造

1:如果建立物件的演算法,應該獨立於該物件的組成部分以及它們的裝配方式時

2:如果同乙個構建過程有著不同的表示時

模式02 生成器模式 Builder

1.意圖 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。2.結構 此模式的結構如下圖所示。3.參與者 4.協作 下圖的互動圖說明了builder和director是如何與乙個客戶協作的。5.效果 以下是builder模式的主要效果 1 它使你可以改變乙個產品的內部表示bu...

生成器模式 Builder

把複雜的物件的構建與其表示分離開,以便根據程式的需要在相同的建立過程中建立不同的表示。每個生成器必須有乙個相同的方法名稱。client 建立乙個 director 物件,指定乙個 build 物件,配置 director。當 product 需要生成時,director 通知該builder bui...

生成器模式 (Builder)

gof意圖 將乙個複雜物件的構建 director 與它的表示 builder 分離,使得同樣的構建過程 director定義的 可以建立不同的表示 builder在組裝的 構建與表示分離 角色 1 builder 為建造者,提供建造part的介面buildpart 建造產品的一部分,獲得建造結果的...