設計模式之建造者模式

建造者模式:
將複雜對象的建立過程和表示進行分離(好吧,我也看不懂什麼意思1)。
來點我人類能聽懂的話:
一、在客戶端看來須要的僅僅是實例化後的類對象(大多數狀況下是須要類的屬性)。
二、傳統方式下當類有了以後,通常直接經過new class()的方式直接進行實例化,而後經過$obj->set1()構建屬性1,$obj->set2()構建屬性2,$obj->set3()構建屬性3。。。
三、傳統方式有一個很大的弊端:當咱們的類發生改變後,咱們須要大量的修改,好比文件1中加上$obj->set4(),文件2中加上$obj->set4(),增長不少的工做量。
四、建造者模式會給出構建對象的具體實現類,將對象的建立實例化過程封裝在建造者類中,並給出一個返回構建後對象的方法,將構建後的對象返回。
五、當類發生改變後,只須要改變建造者類中構建對象的build()方法,對客戶端來講,這並不可見,而且不用作修改就獲得了修改後的對象。改動的只是需求對象修改後的邏輯處理。ui

代碼:this

/**
* 產品類Person
*/
class Person
{
    public $_head;
    public $_body;

    public function setHead($head){
        $this->_head=$head;
    }

    public function getHead(){
        echo $this->_head;
    }

    public function setBody($body){
        $this->_body=$body;
    }

    public function getBody(){
        echo $this->_body;
    }
}

/*
抽象建造者:
定義的一個抽象接口,用於對具體建造者類進行規範
*/
interface Builder{
    public function buildHead();
    public function buildBody();
    public function getResult();
}

/*
具體建造者:
用於實現具體建造者類
*/
class ConcreteBuilder implements Builder{
    public $person;
    public $data;

    public function __construct($data){
        $this->person=new Person();
        $this->data=$data;
    }

    public function buildHead(){
        $this->person->setHead($this->data['head']);
    }

    public function buildBody(){
        $this->person->setBody($this->data['body']);
    }

    public function getResult(){
        return $this->person;
    }
}

/*
導演者類:
用於調用具體建造者類建立產品類實例
*/
class Director{
    public function __construct(ConcreteBuilder $builder){
        $builder->buildHead();
        $builder->buildBody();
    }
}


/*
客戶端:
根據需求進行邏輯處理
*/
$data=array(
    'head'=>'大頭兒子',
    'body'=>'身體棒棒噠'
    );
$builder=new ConcreteBuilder($data);
$director=new Director($builder);
$person=$builder->getResult();
echo $person->_head;
echo $person->_body;
相關文章
相關標籤/搜索