定義:
即生成器模式,將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
在建造者模式中,有如下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 產品類非常複雜,或者產品類中的呼叫順序...