PHP設計模式(五)建造者模式(Builder)

什麼是建造者設計模式

建造者模式:將一個複雜對象的構造與它的表示分離,使一樣的構建過程能夠建立不一樣的表示的設計模式。php

設計場景:設計模式

有一個用戶的UserInfo類,建立這個類,須要建立用戶的姓名,年齡,愛好等信息,才能得到用戶具體的信息結果。如:
這是一個用戶類:
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

建立一個UserBuilder 用戶建造者類,這個類,將UserInfo複雜的建立姓名,年齡,愛好等操做封裝起來,簡化用戶類的建立過程:

這個是將複雜的建立過程封裝在了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(獨立控制邏輯)無關。
三、 模式所建造的最終產品更易於控制。對象

建造者模式與工廠模式的區別:

咱們能夠看到,建造者模式與工廠模式是極爲類似的,整體上,建造者模式僅僅只比工廠模式多了一個「導演類」的角色。在建造者模式的類圖中,假如把這個導演類看作是最終調用的客戶端,那麼圖中剩餘的部分就能夠看做是一個簡單的工廠模式了。接口

與工廠模式相比,建造者模式通常用來建立更爲複雜的對象,由於對象的建立過程更爲複雜,所以將對象的建立過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是將對象的所有建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類通常只提供產品類中各個組件的建造,而將具體建造過程交付給導演類。由導演類負責將各個組件按照特定的規則組建爲產品,而後將組建好的產品交付給客戶端。事件

相關文章
相關標籤/搜索