建造者模式:將一個複雜對象的構造與它的表示分離,使一樣的構建過程能夠建立不一樣的表示的設計模式。php
設計場景:設計模式
class UserInfo { protected $_userName; protected $_userAge; protected $_userHobby; public function setUserName($userName) { $this->_userName = $userName; } public function setUserAge($userAge) { $this->_userAge = $userAge; } public function setUserHobby($userHobby) { $this->_userHobby = $userHobby; } public function getPeopleInfo() { echo "<br>這我的的名字是:" . $this->_userName . "<br>年齡爲:" . $this->_userAge . "<br>愛好:" . $this->_userHobby; } }
$modelUser = new UserInfo(); $modelUser->setUserName('松濤'); $modelUser->setUserAge('23'); $modelUser->setUserHobby('推理小說'); $modelUser->getPeopleInfo();
這我的的名字是:松濤 年齡爲:23 愛好:推理小說
這時候咱們來看建造者設計模式的設計:ide
這個是將複雜的建立過程封裝在了builderPeople這個方法裏面。 接下來是建立對象:ui
class UserBuilder { protected $_obj; public function __construct() { $this->_obj = new UserInfo(); } public function builderPeople($userInfo) { $this->_obj->setUserName($userInfo['userName']); $this->_obj->setUserAge($userInfo['userAge']); $this->_obj->setUserHobby($userInfo['userHobby']); } public function getBuliderPeopleInfo() { $this->_obj->getPeopleInfo(); } }
$userArr = array( 'userName' => '松濤', 'userAge' => '23', 'userHobby' => '推理小說'); $modelUserBuilder = new UserBuilder(); $modelUserBuilder->builderPeople($userArr); $modelUserBuilder->getBuliderPeopleInfo();
這我的的名字是:松濤 年齡爲:23 愛好:推理小說
建造者模式能夠很好的將一個對象的實現與相關的「業務」邏輯分離開來,從而能夠在不改變事件邏輯的前提下,使增長(或改變)實現變得很是容易。this
建造者接口的修改會致使全部執行類的修改。設計
一、 須要生成的產品對象有複雜的內部結構。
二、 須要生成的產品對象的屬性相互依賴,建造者模式能夠強迫生成順序。
三、 在對象建立過程當中會使用到系統中的一些其它對象,這些對象在產品對象的建立過程當中不易獲得。code
一、 建造者模式的使用使得產品的內部表象能夠獨立的變化。使用建造者模式可使客戶端沒必要知道產品內部組成的細節。
二、 每個Builder都相對獨立,而與其它的Builder(獨立控制邏輯)無關。
三、 模式所建造的最終產品更易於控制。對象
咱們能夠看到,建造者模式與工廠模式是極爲類似的,整體上,建造者模式僅僅只比工廠模式多了一個「導演類」的角色。在建造者模式的類圖中,假如把這個導演類看作是最終調用的客戶端,那麼圖中剩餘的部分就能夠看做是一個簡單的工廠模式了。接口
與工廠模式相比,建造者模式通常用來建立更爲複雜的對象,由於對象的建立過程更爲複雜,所以將對象的建立過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是將對象的所有建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類通常只提供產品類中各個組件的建造,而將具體建造過程交付給導演類。由導演類負責將各個組件按照特定的規則組建爲產品,而後將組建好的產品交付給客戶端。事件