深入理解設計模式(七) 建造者模式

2022-05-26 15:54:10 字數 2944 閱讀 3493

建造者模式也稱生成器模式 定義:將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示(依賴倒轉)

產品類:一般是乙個較為複雜的物件,也就是說建立物件的過程比較複雜,一般會有比較多的**量。在本類圖中,產品類是乙個具體的類,而非抽象類。實際程式設計中,產品類可以是由乙個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。

抽象建造者:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現。這樣更容易擴充套件。一般至少會有兩個抽象方法,乙個用來建造產品,乙個是用來返回產品。

建造者:實現抽象類的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品。

指揮類:負責呼叫適當的建造者來組建產品,指揮類一般不與產品類發生依賴關係,與指揮類直接互動的是建造者類。一般來說,指揮類被用來封裝程式中易變的部分。

1.建立複雜物件的演算法獨立於組成物件的部件

2.同乙個建立過程需要有不同的內部表象的產品物件

例子:建房子,不管建什麼房子,它們都離不開地基、柱子、層面和牆體這些組成部分,建築工人就是把這些組成部分乙個個建起來,最後連成一體建出一棟棟樓房。

優點

1.客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件。

2.每乙個具體建造者都獨立,因此可以方便地替換具體建造者或增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件

3.可以更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。

4.增加新的具體建造者無須修改原有類庫的**,指揮者類針對抽象建造者類程式設計,系統擴充套件方便,符合「開閉」。

缺點

1.當建造者過多時,會產生很多類,難以維護。

2.建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,若產品之間的差異性很大,則不適合使用該模式,因此其使用範圍受到一定限制。

3.若產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

工廠模式用於處理如何獲取例項物件問題,建造者模式用於處理如何

建造例項物件問題

建造者模式與工廠模式是極為相似的,總體上,建造者模式僅僅只比工廠模式多了乙個「指揮類」的角色。在建造者模式的類圖中,假如把這個指揮類看做是最終呼叫的客戶端,那麼剩餘的部分就可以看作是乙個簡單的工廠模式了。

與工廠模式相比,建造者模式一般用來建立更為複雜的物件,因為物件的建立過程更為複雜,因此將物件的建立過程獨立出來組成乙個新的類——指揮類。

也就是說,工廠模式是將物件的全部建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;

而建造者模式中,建造者類一般只提供產品類中各個元件的建造,而將具體建造過程交付給指揮類。由指揮類負責將各個元件按照特定的規則組建為產品,然後將組建好的產品交付給客戶端。

product類---產品類,由多個部件組成

//

product類,由多個部件組成

public

class

product

public

void

show()}}

builder類---抽象建造者類,確定產品由兩個部件parta和partb組成,並宣告乙個得到產品建造後結果的方法getresult

abstract

class

builder

具體建造者類

//

concretebuilder1類---具體建造者類

class

concretebuilder1 : builder

public

override

void

builderpartb()

public

override

product getresult()

}//concretebuilder2類---具體建造者類

class

concretebuilder2 : builder

public

override

void

builderpartb()

public

override

product getresult()

}

director類---指揮者類

class

director

}

客戶端**---客戶不需知道具體的建造過程

static

void main(string

args)

建造者模式的使用場合是當建立複雜物件時,把建立物件成員和裝配方法分離出來,放在建造者類中去實現,使用者使用該複雜物件時,不用理會它的建立和裝配過程,只關心它的表示形式。其實完全理解這個模式還是要一番思考的,難以搞懂的是指揮者似乎沒什麼存在的必要,在**裡也沒體現它的作用,我們也可以把指揮者的方法放在建造者裡面,但為什麼沒有這樣做呢?我想這可能是考慮到單一責任原則,建造者只負責建立物件的各個部分,至於各個部分建立的順序、裝配方法它就不管了。還有就是當順序要改變時,建造者可以不用改動,改動指揮者就好了,指揮者只有乙個,建造者有很多,要改建造者就麻煩了。

設計模式學習 七 建造者模式

將乙個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。include using namespace std class product void setpartb int y void setpartc int z private int a,b,...

設計模式學習(七)建造者模式

建造者模式 builder pattern 使用多個簡單的物件一步一步構建成乙個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。該類圖還是沿用咱們之前的車的場景來做說明,從圖中可以看出,建造者模式很像是抽象模式的拓展。首先我們先建立了乙個抽象方法,抽象方法裡包含了sta...

設計模式(七) 模板方法 建造者模式

個人在看書總結,覺得模板方法和建造者模式極為相似 兩字引出例子分別為 招聘流程 面對招聘公司 地點 物件不同,可變化 畫小人 高手矮胖等 兩者都是極為注重流程,卻不依賴細節。主要表現,依賴倒置原則 面向介面程式設計,依賴於抽象而不依賴於具體。寫 時用到具體類時,不與具體類互動,而與具體類的上層接 互...