設計模式之建造者模式

2022-09-08 15:33:15 字數 3175 閱讀 4657

建造者模式屬於建立型設計模式,它提供了一種建立物件的最佳方式。

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

問題描述:建立乙個複雜的物件,它是由多個其它物件「組裝」而來的,並且隨著「組裝元件」的不同而不同。

解決方案:將複雜物件的建立和使用分離開來,並使得相同的建立過程可以建立出不同的產品。

結構圖

說明:(1)builder:抽象建造者,為建立乙個產品物件的各個部件定義的抽象介面。buildpartx()方法用於複雜產品的各個部分;getproduct()方法用於返回建立的結果。

(2)concretebuilder:具體建造者,實現了builder介面,建立一種複雜的具體產品。

(3)product:具體產品類,包含多個組成部分,由具體建造者建立。

(4)director:指揮類,負責安排複雜物件的組裝次序,與建造者存在關聯關係。使用者只需要和指揮類互動就可以完成複雜產品的建立,不需要知道複雜產品的建立細節。

舉個栗子:講乙個肯德基**的故事。。。

我們都去過kfc,每個**的配料不同,自然**也不一。比如(**虛構,請勿當真):

a**:香辣雞腿堡、薯條手捲和雪碧,**30元;

b**:板燒雞腿堡、香酥炸薯條和九珍果汁,**36元;

c**:超級雞腿堡、螺旋薯條14和可口可樂,**42元。

接下來,我們就用建造者模式來實現建立這三種**並記錄各**詳情和**的功能,具體實現方式如下:

(1)建立**的組成類,均繼承父類basefood,香辣雞腿堡spicychickenburger、板燒雞腿堡tepchickenburger、超級雞腿堡superchickenburger、薯條書卷handfrenchfries、香酥炸薯條spicyfrenchfries、螺旋薯條screwfrenchfries、雪碧spritebeverage、九珍果汁fruitjuicebeverage和可口可樂cocacolabeverage。**如下:

其它組成類雷同,此處省略。

(2)建立抽象建造者imealbuilder,因為三個**都有同一種屬性,那就是大致分為三個組成部分,漢堡、薯條和飲料,所以我們就在介面中定義這三個方法,再加上乙個返回建立結果產品類meal物件的方法。其中類meal依賴basefood,符合黎克特制替換原則,包含新增**成分、展示**詳情和計算**總價三個方法。**如下:

(3)分別建立三個具體建造者,a**具體建造者amealbuilder,b**具體建造者bmealbuilder,c**具體建造者cmealbuilder,實現imealbuilder介面中的方法。**如下:

(4)建立乙個指揮類mealdirector,依賴介面imealbuilder,符合依賴倒置原則,它來負責建立不同的**。**如下:

(5)在類builderfragment中通過指揮類mealdirector例項來獲取**類物件meal,實現建立不同**物件並記錄其詳情和**的功能。**如下:

(6)執行後的結果,如下所示:

綜上所述,建造者模式是來解決建立乙個複雜物件的問題,使用者只需指定物件的型別,而不需要知道具體建造細節。在實現的過程中,我們會想到抽象工廠模式,似乎實現方式大致相同,其實不然,建造者模式和抽象工廠模式還是有區別的,抽象工廠模式返回的是一系列相關的產品,而建造者模式只返回一種產品,其中的組成部分是可以靈活多變的,只是複雜物件的整體結構不能變,比如**的組成類別,就只能是漢堡、薯條和飲料這三種,所以建造者模式存在一定的侷限性。

優點

1. 使用者不需要知道產品的組成細節,將產品本身和產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件;

2. 每乙個具體建造者對應著不同的產品物件,它們之間是相對獨立的,可以很方便地替換具體建造者或增加新的具體建造者;

3. 指揮類針對抽象建造者程式設計,增加新的具體建造者時無需修改原有的**,只需要新增乙個具體建造者類並實現抽象建造者介面中的方法即可,系統擴充套件方便,並且符合開閉原則;

4. 可以更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更佳清晰,而且建立次序可以隨意調整。

缺點

1. 產品的整體結構固定,唯一可以改變的是產品的組成部分。如果產品的結構型別差別很大,那麼就不適用於建造者模式了;

2. 如果產品的種類較多且產品的建立比較複雜,那麼就需要使用更多的具體建造者來實現,這樣就會導致系統變得越來越龐大,甚至不易維護。

適用場景

1. 需要生成的產品物件內部結構比較複雜,但是都包含多個成員屬性,成員種類存在一定的相似之處。

2. 需要生成的產品物件的屬性相互依賴,需要指定其生存順序;

3. 複雜物件的建立過程獨立於建立該物件的類;

4. 隔離複雜物件的建立和使用,並使得相同的建立過程可以建立出不同的產品。

設計模式之建造者模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟 設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設 計模式 和...

設計模式之建造者模式

建造者模式也叫生成器模式,是一種物件建立型模式,用來隱藏復合物件的建立過程,它把復合物件的建立過程加以抽象,通過子類繼承或過載的方式,動態的建立具有復合屬性的物件。應用場景 物件的建立 builder 模式是為物件的建立而設計的模式 建立的是乙個復合物件 被建立的物件為乙個具有復合屬性的復合物件 關...

設計模式之建造者模式

在做服務介面的時候,往往在業務處理之前需要做業務校驗,格式校驗等業務前處理。這些介面有個相同的特徵,就是必須經過這些處理步驟之後才能做核心的業務處理,拓展的服務介面也必須經過這些處理。基於這個特徵,我們就來分析一下設計模式中,建造者模式。我們先建乙個基礎的服務類 public abstract cl...