建造者模式
在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負責如何將部件最後組裝成產品。這樣建造者模式就讓設計和實現解耦了。
剛開始接觸建造者模式的時候,最容易把建造者和抽象工廠模式混淆了。由於而這都屬於建立型的設計模式,所以二者之間是有公共點的,但是建造者模式注重於物件組合,即不同的小物件組成乙個整體的複雜大物件,而抽象工廠模式針對於介面程式設計,只是對外提供建立物件的工廠介面,不負責物件之後的處理。
設計模式05 建造者模式
抽象一點說建造者模式的目的 將乙個複雜物件的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。設計模式 gof 舉個例子,一台電腦的主機板上有很多的硬體,可能根據需要要經常的更換。比如現在要將intel的cpu換成amd的,那麼我們不需要從新的構建一塊主機板,而是只換cpu就可以了。這就是建...
設計模式 05 建造者模式 鏈式呼叫
05.建造者模式 鏈式呼叫 我們在開發過程中,經常遇到這種寫法,product product new builder seta fo setb bar setc so build 這種寫法可以一直.set鏈式呼叫,這也是建造者模式的一種寫法,通過鏈式呼叫去裝飾產品。最後build 建造產品。上 p...
C 設計模式 建造者模式
本文固定連線 using system using system.collections.generic using system.linq using system.text using system.threading.tasks public void show 抽象建造者類,確定產品有兩個部...