C 設計模式 建造者模式

2021-08-29 05:14:30 字數 3201 閱讀 6603

建造者模式

在gof的《設計模式 可復用物件導向軟體的基礎》中是這樣說的:將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

這句話,似懂非懂的。乙個複雜物件的建立,其通常是由很多的子物件構成;如果乙個物件能夠直接就建立好了,那麼也不會稱之為複雜物件。由於專案中需求的變化,這個複雜物件的各個部分經常會發生劇烈的變化,但是,不管怎麼變化,將它們組合在一起,組成乙個複雜的物件的事實是不會變的。建造者模式就提供了一種「封裝機制」來將各個物件的變化隔離開,最終,組合成複雜物件的過程是不會變的。

在《大話設計模式》一書中,例舉了乙個很好的例子————建造小人。建造乙個小人,要分為六步:頭部、身體、左手、右手、左腳和右腳。與抽象工廠模式不同的是,建造者模式是在director的控制下一步一步的構造出來的,在建造的過程中,建造者模式可以進行更精細的控制。不管人的頭部、身體、左手、右手、左腳或者右腳如何變化,但是最終還是由這幾部分組合在一起形成乙個人,雖然是同乙個建造過程,但是這個人就會有不同的表示,比如,胖子,瘦子,個高的,個低的等等。

uml圖

類圖如下:

時序圖如下:

**實現

#include using namespace std;

typedef enum mantypetag

mantype;

class man

void setbody(mantype type)

void setlefthand(mantype type)

void setrighthand(mantype type)

void setleftfoot(mantype type)

void setrightfoot(mantype type)

void showman()

void buildbody()

void buildlefthand()

void buildrighthand()

void buildleftfoot()

void buildrightfoot()

man *getman()

private:

man *m_fatman;

};// thismanbuilder

class thinmanbuilder : public builder

void buildhead()

void buildbody()

void buildlefthand()

void buildrighthand()

void buildleftfoot()

void buildrightfoot()

man *getman()

private:

man *m_thinman;

};// director

class director

void createman();

private:

builder *m_builder;

};void director::createman()

int main(int argc, char *argv)

;

上面這個例子比較雜,但是也是建造者模式的應用。下面這個例子是建造者最一般,最簡單的實現方法:

#include #include using namespace std;

class builder;

// product

class product

void showproduct()

;// builder

class builder

virtual void buildpartb() {}

virtual product *getproduct()

};// concretebuilder

class concretebuilder : public builder

void buildparta()

void buildpartb()

product *getproduct()

private:

product *m_product;

};// director

class director

void createproduct()

private:

builder *m_builder;

};// main

int main()

productobj->showproduct();

delete productobj;

productobj = null; // 謝謝賓零同學的review

delete builderobj;

builderobj = null;

}

通過比較上面的兩個例子,可以很容易的把建造者模式的骨架抽象出來。

使用要點

建造者模式生成的物件有複雜的內部結構,將分步驟的去構建乙個複雜的物件,分多少步是確定的,而每一步的實現是不同的,可能經常發生變化;

在上面的例子中,我們都看到了最終生成的man和product都沒有抽象類,這又匯出建造者適用的一種情況,當需要建立複雜物件的過程中,複雜物件沒有多少共同的特點,很難抽象出來時,而複雜物件的組裝又有一定的相似點時,建造者模式就可以發揮出作用。簡單的說,可能使用了建造者模式,最終建造的物件可能沒有多大的關係,關於這一點,閱讀《設計模式 可復用物件導向軟體的基礎》中的建造者模式時是最有體會的。 總結

乙個複雜物件是由多個部件組成的,建造者模式是把複雜物件的建立和部件的建立分別開來,分別用builder類和director類來表示。用director構建最後的複雜物件,而在上面builder介面中封裝的是如何建立乙個個部件(複雜物件是由這些部件組成的),也就是說,director負責如何將部件最後組裝成產品。這樣建造者模式就讓設計和實現解耦了。

剛開始接觸建造者模式的時候,最容易把建造者和抽象工廠模式混淆了。由於而這都屬於建立型的設計模式,所以二者之間是有公共點的,但是建造者模式注重於物件組合,即不同的小物件組成乙個整體的複雜大物件,而抽象工廠模式針對於介面程式設計,只是對外提供建立物件的工廠介面,不負責物件之後的處理。

C 設計模式 建造者模式

本文固定連線 using system using system.collections.generic using system.linq using system.text using system.threading.tasks public void show 抽象建造者類,確定產品有兩個部...

C 設計模式 建造者模式

ifndef builder h define builder h include 說明 乙個複雜物件的建立,其通常是由很多的子物件構成 建造者模式就提供了一種 封裝機制 來將各個物件的變化隔離開,最終,組合成複雜物件的過程是不會變的。定義 建造者模式 將乙個複雜的物件的構建與它的表示分離,使得同樣...

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

繼續設計模式,今天是建造者模式。include include using namespace std include product產品類 class product void show build類,抽象的建造者,確定產品的組成 class builder virtual builder vir...