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

2021-08-28 08:06:55 字數 4438 閱讀 3627

定義:

即生成器模式,將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

在建造者模式中,有如下4個角色:

product 產品類: 通常是實現了模板方法模式,也就是有模板方法和基本方法。例子中的 benzmodel 和 bmwmodel就屬於產品類。

builder 抽象建造者:規範產品的元件,一般是由子類實現。例子中的carbuilder 就屬於抽象建造者。

concretebuilder 具體建造者:實現抽象類定義的所有方法,並且翻譯乙個組建好的物件。例子中的 benzbuilder 和 bmwbuilder 就屬於具體建造者。

director 導演類:負責安排已有模組的順序,然後告訴builder開始建造。

//    **********  4.建造者模式的通用版本 ,**清單11-4:***************//

class product

};class builder

;class concreteproduct: public builder

~concreteproduct()

void setpart(){} //產品類內的邏輯處理

product* buildproduct()

private:

product* m_product;

};class director

~director()

product* getaproduct()

private:

concreteproduct *m_builder;

};int main ()

在carmodel 中定義了乙個 setsequence 方法,車輛模型的動作如何排布在 arraylist 中定義。然後 run() 方法根據 sequence 定義的順序完成指定的順序動作

**********  1.車輛模型擴充套件 ,**清單11-1:***************//

enum esequence

;class carmodel

void run()

;++iter;

}}

private:

qlistm_list;

};class benzmodel:public carmodel

virtual void stop()

virtual void alarm()

virtual void enginboom()

};class bmwmodel:public carmodel

virtual void stop()

virtual void alarm()

virtual void enginboom()

};int main()

增加了乙個carbuilder 抽象類,用來組裝各個車模,需要什麼型別什麼順序的車輛模型,都由相關的子類完成。

**********  2.車輛模型擴充套件 ,**清單11-2:***************//

enum esequence

;class carmodel

void run()

;++iter;

}}

private:

qlistm_list;

};class benzmodel:public carmodel

virtual void stop()

virtual void alarm()

virtual void enginboom()

};class bmwmodel:public carmodel

virtual void stop()

virtual void alarm()

virtual void enginboom()

};class carbuilder

;class benzbuilder: public carbuilder

~benzbuilder()

virtual void setsequence(qlistlist)

virtual carmodel* getcarmodel()

private:

benzmodel *m_benz;

};class bmwbuilder: public carbuilder

~bmwbuilder()

virtual void setsequence(qlistlist)

virtual carmodel* getcarmodel()

private:

bmwmodel *m_bmw;

};int main()

增加了乙個 director 類,負責按照指定的順序生產模型

getabenzmodel 方法:元件出a型號的賓士車模型,其過程為只有start 、stop ;沒有engineboom 、alarm 。

getbbenzmodel 方法:元件出b型號的賓士車模型,其過程為 engineboom → start → stop ;沒有alarm 。

getcbmwmodel 方法:元件出c型號的寶馬車模型,其過程為 alarm → start → stop ,沒有engineboom

getdbmwmodel 方法:元件出d型號的寶馬車模型,其過程為 start ; 沒有engineboom 、alarm 、stop

**********  3.車輛模型擴充套件 ,**清單11-3:***************//

enum esequence

;class carmodel

void run()

;++iter;

}}

private:

qlistm_list;

};class benzmodel:public carmodel

virtual void stop()

virtual void alarm()

virtual void enginboom()

};class bmwmodel:public carmodel

virtual void stop()

virtual void alarm()

virtual void enginboom()

};class carbuilder

;class benzbuilder: public carbuilder

~benzbuilder()

virtual void setsequence(qlistlist)

virtual carmodel* getcarmodel()

private:

benzmodel *m_benz;

};class bmwbuilder: public carbuilder

~bmwbuilder()

virtual void setsequence(qlistlist)

virtual carmodel* getcarmodel()

private:

bmwmodel *m_bmw;

};//導演類

class director

~director()

benzmodel* getabenzmodel()

benzmodel* getbbenzmodel()

bmwmodel* getcbmwmodel()

bmwmodel* getdbmwmodel()

private:

qlistm_list;

benzbuilder *m_benzbuilder;

bmwbuilder *m_bmwbuilder;

};int main()

//3輛b型別賓士車

for (int i = 0; i < 3; ++i)

//4輛c型別寶馬車

for (int i = 0; i < 4; ++i)

return 0;

}

建造者模式關注的是零件型別和裝配工藝(順序),這是它與工廠方法模式最大的不同。

參考文獻《秦小波. 設計模式之禪》(第2版) (華章原創精品) . 機械工業出版社

c 設計模式 5 建造者模式

建立型設計模式,就是專門用來建立物件 建立物件的事兒全權由你負責,我就不操心了,有點想領導的感覺,命令下去,活都是工人的,至於是哪個人去做那些事,才是領導的責任。建造者模式,例如乙個車間系統中,如果需要車間老闆想要一批車輛時,在這個實際需求中,車輛就是乙個複雜的物件,它是由車燈 車輛 機箱等組裝而成...

設計模式 5 建造者模式

什麼是建造者模式?構造者模式 bulder pattern 將乙個複雜物件的構建與表示分離,使得同樣的構建可以建立不同的表示。為什麼使用建造者模式?複雜物件相當於一輛有待建造的汽車,而物件的屬性相當於汽車的部件,建造產品的過程就相當於組合部件的過程。由於組合部件的過程很複雜,因此,這些部件的組合過程...

設計模式5 建造者模式

建造者模式 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以創造不同的表示。使用場景 1 相同的方法,不同的執行順序,產生不同的事件結果,可以採用建造者模式 2 多個部件或零件,都可以裝配到乙個物件中,但是產生的執行結果又不相同時,可以使用該模式 3 產品類非常複雜,或者產品類中的呼叫順序...