趁熱打鐵,繼續第二篇文章,十一前多學多寫。
原文地址:http://blog.csdn.net/lengzijian/article/details/8025091
首先看書上說的,將一個複雜對象的結構與它表示分離,是同樣的構建過程可以構建不同的表示
原以爲就是一個非常複雜的,有多個部分組成,單獨把每個部分提取出來創建,再通過繼承的方式創建不同的複雜對象
後來發現自己進入了一個誤區,首先應該肯定的是Builder是創建型的模式,主要用於創建一個複雜的對象。至於有人說把Builder當做創建型會讓人進入誤區,多數是理論派的代表。
先來看下Builder 模式結構圖
(圖來源於書上)
多繼承是一種實現方式,並非最優化的方式。
可以通過繼承BuildPartA、BuildPartB、BuildPartC的方式來創建不同的複雜對象
缺點是:每當有新類型產生是,需要添加代碼,即每個對象都有自己的BuildPartA。。。
單繼承多實現:通過添加變量的方式實現不同對象創建,有如下兩種方式:
1.在GetProduct中添加變量:
void ConcreteBuilder::GetProduct(string type)
{
switch(type)
{
case "A":
BuildPartA();
break
case "BC":
BuildPartB();
BuildPartC();
}
}
2.在BuildPart中添加變量:
void ConcreteBuilder::BuildPartA(const string&buildPara)
{
cout<<"Step1:Build PartA..."<<buildPara<<endl;
}
或者兩種都用,這樣就可以解決不停創建子類的麻煩,由於在每一部構造過程中,可以引入參數,是的經過相同步驟創建最後得到的對象的展示不一樣。
下面附上可運行源碼,linux下make即可:
https://github.com/lengzijian/Builder
代碼結構:
Builder:創建Product對象的所需各部分的抽象接口
ConcreteBuilder:負責chaung見的具體接口
Director:負責發出創建命令
Product:產品