第 10 章 建造者模式

2021-06-22 07:51:00 字數 4897 閱讀 6284

<?php

header("content-type: text/html; charset=utf-8");

/*** 建造者模式

* * 又是乙個週三,快要下班了,老大突然又拉住我,喜滋滋的告訴我「牛叉公司很滿意我們做的模型,

* 又簽訂了乙個合同,把賓士、寶馬的車輛模型都交給我我們公司製作了,不過這次又額外增加了乙個新需

* 求:汽車的啟動、停止、喇叭聲音、引擎聲音都有客戶自己控制,他想什麼順序就什麼順序,這個沒問題吧?」。

** 看著老大殷切的目光,我還能說啥,肯定的點頭,「沒問題!」,加班加點做唄,「再苦再累就當自己二

* 百五 再難再險就當自己二皮臉 與君共勉!」這句話說出了我的心聲。那任務是接下來,我們怎麼做實現呢?

* * 首先我們想了,賓士、寶馬都是乙個產品,他們有共有的屬性,牛叉公司關心的是單個模型,賓士模

* 型a 是先有引擎聲音,然後再啟動;賓士模型b 呢是先啟動起來,然後再有引擎聲音,這才是牛叉公司要

* 關關心的,那到我們老大這邊呢,就是滿足人家的要求,要什麼順序就立馬能產生什麼順序的模型出來,

* 我呢就負責把老大的要求實現掉,而且還要是批量的,看不懂?沒關係,繼續看下去,首先由我生產出n

* 多個賓士和寶馬車輛模型,這些車輛模型的都有run 方法,但是具體到每乙個模型的run 方法可能中間的

* 執行任務的順序是不同的,老大說要啥順序,我就給啥順序,最終客戶買走後只能是既定的模型。

*///我們定義了乙個carmodel 的抽象類,其中run 和setsequence 是由抽象類實現的,其他都是子類自己

//實現,那這個是否可以解決這個問題呢?應該可以,我們把**實現出來,先看carmodel類:

/*** 定義乙個車輛模型的抽象類,所有的車輛模型都繼承這裡類

*/abstract class carmodel else if(self::action_stop == $actionname)else if(self::action_alarm == $actionname)else if(self::action_engineboom == $actionname)}}

final public function setsequence($sequence)

}    

/*** 其中setsequence 方法是允許客戶自己設定乙個順序,是要先跑起來在有引擎聲音還是先有引擎聲音再

* 跑起來,還是說那個喇叭就不要響,對於乙個具體的模型永遠都固定的,那這個事由牛叉告訴我們,有1w 件事

* 這樣的,1w 件事那樣的順序,目前的設計都能滿足這個要求。

* * run 方法使用了乙個陣列的遍歷,確定那個是先執行,程式比較簡單,不多說了,我們繼續看兩個實現類,

* 先看benzmodel類:

*/// 增加了乙個carbuilder 的抽象類,以及兩個實現類,其目的是你要什麼排列順序的車,我就給你什麼順

// 序的車,那我們先看carbuilder類:

/*** 要什麼順序的車,你說,我給建造出來

*/abstract class carbuilder

/*** 賓士車模型

*/class benzmodel extends carmodel

protected function engineboom()

protected function start()

protected function stop()

}// 沒啥特別的,不多說,再看bmwmodel類:

/*** 寶馬車模型

*/class bmwmodel extends carmodel

protected function engineboom()

protected function start()

protected function stop()

}// 這個抽象模擬較簡單,程式上也以後注釋說明,不多說,我們看兩個實現類,先看benzbuilder類

/*** 各種設施都給了,我們按照一定的順序製造乙個賓士車

*/class benzbuilder extends carbuilder

public function getcarmodel()

public function setsequence(array $sequence)

}// 下面是bmwbuilder類:

/*** 給定乙個順序,返回乙個寶馬車

*/class bmwbuilder extends carbuilder

public function getcarmodel()

public function setsequence(array $sequence)

}/**

* 增加了director 類,這個類是做了層封裝,類中的方法說明如下:

* a 型號的賓士車輛模型是只有啟動(start)、停止(stop)方法,其他的引擎聲音、喇叭都沒有;

* b 型號的賓士車是先發動引擎(engine boom),然後啟動(star),再然後停車(stop),沒有喇叭;

* c 型號的寶馬車是先喇叭叫一下(alarm),然後(start),再然後是停車(stop),引擎不轟鳴;

* d 型號的寶馬車就乙個啟動(start),然後一路跑到黑,永動機,沒有停止方法,沒有喇叭,沒有引擎轟鳴;

* e 型號、f 型號…等等,可以有很多,啟動(start)、停止(stop)、喇叭(alarm)、引擎轟鳴(engine boom)

* 這四個方法在這個類中可以隨意的自由組合,有幾種呢?好像是排列組合,這個不會算,高中數學沒學好,反正

* 有很多種了,這裡都可以實現。

** 我們看一下**實現,director類:

*//**

* 導演安排順序,生產車輛模型

*/class director

/*** 初始化環境

*/private function clearenv()

/*** a型別的賓士車模型,先start,然後stop,其他什麼引擎了,喇叭一概沒有

*/public function getabenzmodel()

/*** b型號的賓士車模型,是先發動引擎,然後啟動,然後停止,沒有喇叭

*/public function getbbenzmodel()

/*** c型號的寶馬車是先按下喇叭(炫耀嘛),然後啟動,然後停止

*/public function getcbmwmodel()

/*** d型別的寶馬車只有乙個功能,就是跑,啟動起來就跑,永遠不停止,牛叉

*/public function getdbmwmodel()

/*** 這裡還可以有很多方法,你可以先停止,然後再啟動,或者一直停著不動,靜態的嘛

* 導演類嘛,按照什麼順序是導演說了算*/}

// 然後client程式就只與director 打交道了,牛叉公司要a 型別的賓士車2輛,b 型別的賓士車2輛,

// c 型別的寶馬車2輛,d 型別的我不要:

// 這裡是牛叉公司的天下,他要啥我們給啥,下面即client程式:

$director = new director();

//2輛a型別的賓士車

echo "2輛a型別的賓士車

";for($i=0; $i<2; $i++)

//2輛b型別的賓士車

echo "

";echo "2輛b型別的賓士車

";for($i=0; $i<2; $i++)

//2輛c型別的寶馬車

echo "

";echo "2輛c型別的寶馬車

";for($i=0; $i<2; $i++)

/*** 整個程式編寫完畢,而且簡潔明瞭,這就是建造者模式,中間有幾個角色需要說明一下:

* * client 就是牛叉公司,這個到具體的應用中就是其他的模組或者頁面;

* * carmodel 以及兩個實現類benzmodel 和bmwmodel 叫做產品類(product class),這個產品類實現

* 了模板方法模式,也就是有模板方法和基本方法,這個參考上一節的模板方法模式;

* * carbuilder 以及兩個實現類benzbuilder 和bmwbuilder 叫做建造者(builder class),在上面的

* 那個例子中就是我和我的團隊,負責建造benz 和bmw 車模,按照指定的順序;

* * director 類叫做導演類(director class),負責安排已有模組的順序,然後告訴builder 開始建造,

* 在上面的例子中就是我們的老大,client 找到老大,說我要這個,這個,那個型別的車輛模型,然後老大就把

* 命令傳遞給我,我和我的團隊就開始拼命的建造,於是乙個專案建設完畢了。

* * 大家看到這裡估計就開始犯嘀咕了,這個建造者模式和工廠模式非常相似呀,yes,是的,是非常相似,但

* 是記住一點你就可以游刃有餘的使用了:建造者模式最主要功能是基本方法的呼叫順序安排,也就是這些基本方

* 法已經實現了;而工廠方法則重點是建立,你要什麼物件我創造乙個物件出來,組裝順序則不是他關心的。

執行結果:

2輛a型別的賓士車

賓士車跑起來是這個樣子的...

賓士車應該這樣停車...

賓士車跑起來是這個樣子的...

賓士車應該這樣停車...

2輛b型別的賓士車

賓士車的引擎是這個聲音的...

賓士車跑起來是這個樣子的...

賓士車應該這樣停車...

賓士車的引擎是這個聲音的...

賓士車跑起來是這個樣子的...

賓士車應該這樣停車...

2輛c型別的寶馬車

寶馬車的喇叭聲音是這個樣子的...

寶馬車跑起來是這個樣子的...

寶馬車應該這樣停車...

寶馬車的喇叭聲音是這個樣子的...

寶馬車跑起來是這個樣子的...

寶馬車應該這樣停車...

009 第13章 建造者模式

簡述 建造者模式將乙個複雜的物件構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。建造者模式包括 指揮者類 抽象建造者類 具體建造者類 具體產品類。指揮者類 構建乙個使用抽象建造者介面的物件。抽象建造者類 為建立乙個具體產品類物件的各個部件指定的抽象介面。具體建造者類 實現抽象建造者類介面,...

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

一 定義 建造者模式將乙個複雜物件的構建與他的表示分離,使得同樣的構建過程可以建立不同的表示。二 框架運用 httpclient框架在構建client時就用到了建造者模式 三 實戰 1 產品類 public class product public void show 2 建造類 public ab...

設計模式 10)建造者模式

假設你是個木工手藝人,會做各種高矮胖瘦的人物,現在讓你做乙個男生和女生。class person public void show class personwomanbuilder class personmanbuilder personwomanbuilder womanbuilder new ...