真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP中的建造者模式是什么

這篇文章主要介紹“PHP中的建造者模式是什么”,在日常操作中,相信很多人在PHP中的建造者模式是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”P(pán)HP中的建造者模式是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站是一家專業(yè)提供濱州企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為濱州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

建造者模式,也可以叫做生成器模式,builder這個(gè)詞的原意就包含了建筑者、開(kāi)發(fā)者、創(chuàng)建者的含義。很明顯,這個(gè)模式又是一個(gè)創(chuàng)建型的模式,用來(lái)創(chuàng)建對(duì)象。那么它的特點(diǎn)是什么呢?從建筑上來(lái)說(shuō),蓋房子不是一下子就馬上能把一個(gè)房子蓋好的,而是通過(guò)一磚一瓦搭建出來(lái)的。一個(gè)房子不僅有磚瓦,還有各種管道,各種電線等等,由它們各個(gè)不部分共同組成了一棟房子。可以說(shuō),建造者模式就是這樣非常形象的由各種部件來(lái)組成一個(gè)對(duì)象(房子)的過(guò)程。

Gof類圖及解釋

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

GoF類圖

PHP中的建造者模式是什么

代碼實(shí)現(xiàn)

class Product
{
    private $parts = [];

    public function Add(String $part): void
    {
        $this->parts[] = $part;
    }

    public function Show(): void
    {
        echo PHP_EOL . '產(chǎn)品創(chuàng)建 ----', PHP_EOL;
        foreach ($this->parts as $part) {
            echo $part, PHP_EOL;
        }
    }
}

產(chǎn)品類,你可以把它想象成我們要建造的房子。這時(shí)的房子還沒(méi)有任何內(nèi)容,我們需要給它添磚加瓦。

interface Builder
{
    public function BuildPartA(): void;
    public function BuildPartB(): void;
    public function GetResult(): Product;
}

class ConcreteBuilder1 implements Builder
{
    private $product;

    public function __construct()
    {
        $this->product = new Product();
    }

    public function BuildPartA(): void
    {
        $this->product->Add('部件A');
    }
    public function BuildPartB(): void
    {
        $this->product->Add('部件B');
    }
    public function GetResult(): Product
    {
        return $this->product;
    }
}

class ConcreteBuilder2 implements Builder
{
    private $product;

    public function __construct()
    {
        $this->product = new Product();
    }

    public function BuildPartA(): void
    {
        $this->product->Add('部件X');
    }
    public function BuildPartB(): void
    {
        $this->product->Add('部件Y');
    }
    public function GetResult(): Product
    {
        return $this->product;
    }
}

建造者抽象及其實(shí)現(xiàn)。不同的開(kāi)發(fā)商總會(huì)選用不同的品牌材料,這里我們有了兩個(gè)不同的開(kāi)發(fā)商,但他們的目的一致,都是為了去蓋房子(Product)。

class Director
{
    public function Construct(Builder $builder)
    {
        $builder->BuildPartA();
        $builder->BuildPartB();
    }
}

構(gòu)造器,用來(lái)調(diào)用建造者進(jìn)行生產(chǎn)。沒(méi)錯(cuò),就是我們的工程隊(duì)。它來(lái)選取材料并進(jìn)行建造。同樣的工程隊(duì),可以接不同的單,但蓋出來(lái)的都是房子。只是這個(gè)房子的材料和外觀不同,大體上的手藝還是共通的。

$director = new Director();
$b1 = new ConcreteBuilder1();
$b2 = new ConcreteBuilder2();

$director->Construct($b1);
$p1 = $b1->getResult();
$p1->Show();

$director->Construct($b2);
$p2 = $b2->getResult();
$p2->Show();

最后看看我們的實(shí)現(xiàn),是不是非常簡(jiǎn)單,準(zhǔn)備好工程隊(duì),準(zhǔn)備好不同的建造者,然后交給工程隊(duì)去生產(chǎn)就好啦?。?/p>

  • 其實(shí)這個(gè)模式要解決的最主要問(wèn)題就是一個(gè)類可能有非常多的配置、屬性,這些配置、屬性也并不全是必須要配置的,一次性的實(shí)例化去配置這些東西非常麻煩。這時(shí)就可以考慮讓這些配置、屬性變成一個(gè)一個(gè)可隨時(shí)添加的部分。通過(guò)不同的屬性組合拿到不同的對(duì)象。

  • 上面那一條,在GoF那里的原文是:它使你改變一個(gè)產(chǎn)品的內(nèi)部表示;它將構(gòu)造代碼和表示代碼分開(kāi);它使你可以對(duì)構(gòu)造過(guò)程進(jìn)行更精細(xì)的控制。

  • 再說(shuō)得簡(jiǎn)單一點(diǎn),對(duì)象太復(fù)雜,我們可以一部分一部分的拼裝它!

  • 了解過(guò)一點(diǎn)Android開(kāi)發(fā)的一定不會(huì)陌生,創(chuàng)建對(duì)話框?qū)ο驛lterDialog.builder

  • Laravel中,數(shù)據(jù)庫(kù)組件也使用了建造者模式,你可以翻看下源碼中Database\Eloquent和Database\Query目錄中是否都有一個(gè)Builder.php

大家都知道,手機(jī)組裝是一件復(fù)雜的過(guò)程,于是,不同型號(hào)的手機(jī)我們都有對(duì)應(yīng)的圖紙(Builder),將圖紙和配件交給流水線上的工人(Director),他們就會(huì)根據(jù)圖紙使用配件來(lái)生產(chǎn)出我們所需要的各種不同型號(hào)的手機(jī)(Product)。很明顯,我們都是偉大的建造者,為我們的產(chǎn)業(yè)添磚加瓦!??!

完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php

實(shí)例

前面說(shuō)過(guò)Android中有很多Dialog對(duì)話框都會(huì)用建造者模式來(lái)實(shí)現(xiàn),作為一家手機(jī)廠的老板,定制化的Android系統(tǒng)也是非常重要的一個(gè)部分。就像X米一樣,從MIUI入手,先拿下了軟件市場(chǎng),讓大家覺(jué)得這個(gè)系統(tǒng)非常好用,然后再開(kāi)始開(kāi)發(fā)手機(jī)。這就說(shuō)明軟硬件的確是現(xiàn)代手機(jī)的兩大最重要的組成部分,缺了誰(shuí)都不行。這回,我們就用建造者模式簡(jiǎn)單的實(shí)現(xiàn)一套對(duì)話框組件吧!

對(duì)話框類圖

PHP中的建造者模式是什么

完整源碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder-dialog.php

attributes[] = $attr;
    }
    public function AddButtons($button)
    {
        $this->buttons[] = $button;
    }
    public function SetTitle($title)
    {
        $this->title = $title;
    }
    public function SetContent($content)
    {
        $this->content = $content;
    }

    public function ShowDialog(){
        echo PHP_EOL, '顯示提示框 === ', PHP_EOL;
        echo '標(biāo)題:' . $this->title, PHP_EOL;
        echo '內(nèi)容:' . $this->content, PHP_EOL;
        echo '樣式:' . implode(',', $this->attributes), PHP_EOL;
        echo '按扭:' . implode(',', $this->buttons), PHP_EOL;
    }
}

interface Builder
{
    public function BuildAttribute($attr);
    public function BuildButton($button);
    public function BuildTitle($title);
    public function BuildContent($content);
    public function GetDialog();
}

class DialogBuilder implements Builder{
    private $dialog;
    public function __construct(){
        $this->dialog = new Dialog();
    }
    public function BuildAttribute($attr){
        $this->dialog->AddAttributes($attr);
    }
    public function BuildButton($button){
        $this->dialog->AddButtons($button);
    }
    public function BuildTitle($title){
        $this->dialog->SetTitle($title);
    }
    public function BuildContent($content){
        $this->dialog->SetContent($content);
    }
    public function GetDialog(){
        return $this->dialog;
    }
}

class DialogDirector {
    public function Construct($title, $content){

        $builder = new DialogBuilder();

        $builder->BuildAttribute('置于頂層');
        $builder->BuildAttribute('居中顯示');

        $builder->BuildButton('確認(rèn)');
        $builder->BuildButton('取消');

        $builder->BuildTitle($title);
        $builder->BuildContent($content);
        
        return $builder;
    }
}

class ModalDialogDirector {
    public function Construct($title, $content){

        $builder = new DialogBuilder();

        $builder->BuildAttribute('置于頂層');
        $builder->BuildAttribute('居中顯示');
        $builder->BuildAttribute('背景庶照');
        $builder->BuildAttribute('外部無(wú)法點(diǎn)擊');

        $builder->BuildButton('確認(rèn)');
        $builder->BuildButton('取消');

        $builder->BuildTitle($title);
        $builder->BuildContent($content);
        
        return $builder;
    }
}

$d1 = new DialogDirector();
$d1->Construct('窗口1', '確認(rèn)要執(zhí)行操作A嗎?')->GetDialog()->ShowDialog();

$d2 = new ModalDialogDirector();
$d2->Construct('窗口2', '確認(rèn)要執(zhí)行操作B嗎?')->GetDialog()->ShowDialog();

說(shuō)明

  • 這回我們的產(chǎn)品就有點(diǎn)復(fù)雜了,有標(biāo)題、內(nèi)容、屬性、按扭等

  • 建造過(guò)程其實(shí)都一樣,但這里我們主要使用了不同的構(gòu)造器。普通對(duì)話框外面的東西是可以點(diǎn)擊的,而模態(tài)窗口一般會(huì)有遮罩層,就是背景變成透明黑,而且外面的東西是不能再點(diǎn)擊的

  • 如果每次都直接通過(guò)構(gòu)造方法去實(shí)例化窗口類,那要傳遞的參數(shù)會(huì)很多,而現(xiàn)在這樣,我們就可以通過(guò)建造者來(lái)進(jìn)行組合,讓對(duì)象具有多態(tài)的效果,能夠呈現(xiàn)不同的形態(tài)及功能

到此,關(guān)于“PHP中的建造者模式是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


網(wǎng)頁(yè)標(biāo)題:PHP中的建造者模式是什么
文章鏈接:http://weahome.cn/article/pssggi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部