PHP生成器模式

無(wú)論是在現(xiàn)實(shí)世界中還是在軟件系統(tǒng)中,都存在一些復(fù)雜的對(duì)象,它們擁有多個(gè)組成部分。例如,我點(diǎn)了一杯奶茶,我只負(fù)責(zé)付錢(qián),工作人員則給我一杯奶茶,在此期間我一般不會(huì)去關(guān)心放了多少奶,和其他的東西。畢竟不同的配方不同的口感也就代表了不同的價(jià)錢(qián)。

建造者模式(Builder Pattern): 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

建造者模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,<u>它允許用戶(hù)只通過(guò)指定復(fù)雜對(duì)象的類(lèi)型和內(nèi)容就可以構(gòu)建它們</u>,用戶(hù)不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。建造者模式屬于對(duì)象創(chuàng)建型模式。根據(jù)中文翻譯的不同,建造者模式又可以稱(chēng)為生成器模式

生成器模式結(jié)構(gòu)圖

生成器模式結(jié)構(gòu)圖

生成器模式結(jié)構(gòu)圖

根據(jù)上面生成器模式結(jié)構(gòu)圖
板栗:

// Beverages
// 抽象建造者:引入抽象建造者的目的,是為了將建造的具體過(guò)程交與它的子類(lèi)來(lái)實(shí)現(xiàn)。
abstract class Builder
{
    public $result;
    abstract public function setWater();
    abstract public function setMilk();
    abstract public function setSugar();
    public function __construct()
    {
        // $this->result = $res;
    }
    public function getMilkyTea(){
        return $this->result;
    }
}
// 建造者:實(shí)現(xiàn)抽象類(lèi)的所有未實(shí)現(xiàn)的方法,組建產(chǎn)品、返回組建好的產(chǎn)品。
class ConcreteBuilder extends Builder
{
    public function setWater()
    {
        $this->result['water']='50ml';
    }
    public function setMilk()
    {
        $this->result['milk']='25ml';
    }
    public function setSugar()
    {
        $this->result['sugar']='10g';
    }
}
// 導(dǎo)演類(lèi):負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅?lái)組建產(chǎn)品
class Director
{
    private $builder;
    public function __construct(Builder $param)
    {
        $this->builder = $param;
    }
    public function build()
    {
        $this->builder->setWater();
        $this->builder->setMilk();
        $this->builder->setSugar();
    }
}

$milkyTea = new ConcreteBuilder();
$director = new Director($milkyTea);
$director->build();
$result = $milkyTea->getMilkyTea();
print_r($result);

這里只是一個(gè)簡(jiǎn)單的示例,大家可以修改一下,water、milk、sugar等改為其他值?;蛘呤侵貙?xiě)這方法,可以建造出咖啡、奶茶、果奶等等。

意圖: 將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

主要解決: 主要解決在軟件系統(tǒng)中,有時(shí)候面臨著"一個(gè)復(fù)雜對(duì)象"的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對(duì)穩(wěn)定。

何時(shí)使用: 一些基本部件不會(huì)變,而其組合經(jīng)常變化的時(shí)候。

如何解決: 將變與不變分離開(kāi)。

關(guān)鍵代碼: 建造者:創(chuàng)建和提供實(shí)例,導(dǎo)演:管理建造出來(lái)的實(shí)例的依賴(lài)關(guān)系。

應(yīng)用實(shí)例: 去肯德基,漢堡、可樂(lè)、薯?xiàng)l、炸雞翅等是不變的,而其組合是經(jīng)常變化的,生成出所謂的"套餐"。

優(yōu)點(diǎn): 1、建造者獨(dú)立,易擴(kuò)展。 2、便于控制細(xì)節(jié)風(fēng)險(xiǎn)。

缺點(diǎn): 1、產(chǎn)品必須有共同點(diǎn),范圍有限制。 2、如內(nèi)部變化復(fù)雜,會(huì)有很多的建造類(lèi)。

使用場(chǎng)景: 1、需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。 2、需要生成的對(duì)象內(nèi)部屬性本身相互依賴(lài)。

注意事項(xiàng): 與工廠模式的區(qū)別是:建造者模式更加關(guān)注與零件裝配的順序。

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 繼續(xù)導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 在討論工廠方法模式的時(shí)候,提到了一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架。 對(duì)于...
    七寸知架構(gòu)閱讀 6,155評(píng)論 1 64
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評(píng)論 19 139
  • 建造者模式(生成器模式) 介紹 沒(méi)有人買(mǎi)車(chē)會(huì)只買(mǎi)一個(gè)輪胎或者方向盤(pán),大家買(mǎi)的都是一輛包含輪胎、方向盤(pán)和發(fā)動(dòng)機(jī)等多個(gè)...
    666真666閱讀 5,410評(píng)論 2 10
  • ① 關(guān)于幸福這個(gè)話題,嗯!不好說(shuō)。假如你去問(wèn)一個(gè)男人的話,他很有可能會(huì)說(shuō):老婆孩子熱炕頭~...
    撿到蜜罐的熊閱讀 104評(píng)論 0 0
  • 今天晚上西紅門(mén)后街又著火了:安全重于泰山。 明天整理安全隱患
    京心達(dá)張新波閱讀 223評(píng)論 0 0

友情鏈接更多精彩內(nèi)容