我與C++設計模式(三)——建造者Builder

Builder的定義就是:將一個複雜對象的構建於它的表示分離,使得同樣的構建過程可以創建不同的表示。我想說構建我懂,表示?什麼意思?我的理解是將對象的構建過程和構建出來的結果分離,在之前,你怎麼寫構造基本就決定了對象的樣子,調用不同的構造語句即可得到不同的對象,而我們希望用幾乎一樣構造語句創建出不同的對象,只是通過傳遞不同的參數即可完成。分離構建與表示的關鍵在於,抽象出構建過程,將對象的構建固定成幾個步驟,就像流水線,一個環節跟着一個環節,比如說飲料都是上瓶子,裝水,蓋上蓋子,貼標籤,但是對於可樂和雪碧他們的瓶子不一樣,蓋子不一樣,內容不一樣,標籤也不一樣,但都是這四步流程。這是一個內部的小封裝處理。Builder的思路就很類似了。

對於一個產品Product,有a、b、c三個屬性,Builder是Product的建造者,有點工廠的味道,在Builder中,我們把a、b、c的構建封裝起來,但如果僅僅是這樣,那每增加一個類,都得建一個對應的Builder,多態啊,當然要對Builder進行一次多態處理,創建一個AbstractBuilder,這樣用一個AbstractBuilder指針就可以了。可是如果要在每次創建之後分別進行各種屬性設置,還是比較繁瑣。我們需要用一個東西將所有的屬性設置函數封裝起來完成,添加一個操作封裝類,Director,這個類就是組裝產品步驟的,就是設計流水線。對於客戶端來說,只需要對Director調用操作就行了,哎,我是對着UML圖來寫的,你要是看暈了,建議在對着UML圖再看一遍:


圖來源於這兒

圖中顯示,Product定義了一個類,其構造函數並沒有幹多少實際的事情,就只是建了一個空殼,而真正的流水線是在Builder中完成,對於Product所對應的Builder有所有的流水工序,而最終完成是靠一個Direct類,Direct類中有AbstractBuilder指針,這樣就能隨意調用了,那麼最後Builder模式呈現的效果是,對每一種相同工序的Product都可以定義一個對應的Builder類,最後用Direct爲接口,通過AbstractBuilder指針完成所有流水線加工。

對比Builder模式和Abstract Factory模式,前者是對相同構建工序的產品(比如可樂和雪碧)進行一個抽象封裝,後者是將相同族羣的產品(構建過程不要求,比如Windows和Linux)進行抽象。共同之處都是針對對象的創建下功夫,工廠是將創建搬到工廠中,用一個抽象工廠指針搞定,Builder是將創建搬到Builder中並且打散,汆成多步,用一個Direct統一調用。

發佈了33 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章