Analisis mendalam tentang corak pembina dalam PHP

青灯夜游
Lepaskan: 2023-04-10 11:36:01
ke hadapan
2598 orang telah melayarinya

Dalam artikel sebelumnya "Perbincangan ringkas tentang corak perantara dalam PHP " kami memperkenalkan corak perantara dalam PHP Artikel ini akan membawa anda memahami corak pembina dalam corak reka bentuk PHP.

Analisis mendalam tentang corak pembina dalam PHP

Mod pembina juga boleh dipanggil mod penjana Maksud asal perkataan pembina merangkumi makna pembina, pembangun dan pencipta. Jelas sekali, mod ini ialah mod penciptaan lain, digunakan untuk mencipta objek. Jadi apakah ciri-cirinya? Dari sudut seni bina, membina rumah bukanlah sesuatu yang boleh dibina serta-merta, tetapi dibina bata demi bata. Sebuah rumah bukan sahaja mempunyai batu bata dan jubin, tetapi juga pelbagai paip, pelbagai wayar, dan lain-lain, dan pelbagai bahagiannya bersama-sama membentuk sebuah rumah. Boleh dikatakan bahawa corak pembina adalah proses yang sangat jelas untuk menyusun objek (rumah) daripada pelbagai komponen.

Rajah dan penjelasan kelas Gof

Definasi GoF: Asingkan pembinaan objek kompleks daripada perwakilannya, supaya proses pembinaan yang sama boleh mencipta perwakilan yang berbeza

Rajah kelas GoF

Analisis mendalam tentang corak pembina dalam PHP

Pelaksanaan kod

class Product
{
    private $parts = [];

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

    public function Show(): void
    {
        echo PHP_EOL . '产品创建 ----', PHP_EOL;
        foreach ($this->parts as $part) {
            echo $part, PHP_EOL;
        }
    }
}
Salin selepas log masuk

Kelas produk, anda boleh Fikirkan daripadanya seperti rumah yang ingin kami bina. Rumah pada ketika ini belum mempunyai apa-apa kandungan lagi, kita perlu menambahnya.

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;
    }
}
Salin selepas log masuk

Abstraksi pembina dan pelaksanaannya. Pemaju yang berbeza akan sentiasa menggunakan bahan jenama yang berbeza Di sini kita mempunyai dua pemaju yang berbeza, tetapi tujuan mereka adalah sama, untuk membina rumah (Produk).

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

Pembina, digunakan untuk memanggil pembina untuk pengeluaran. Betul, itu pasukan kejuruteraan kami. Ia memilih bahan dan membina. Pasukan kejuruteraan yang sama boleh menerima pesanan yang berbeza, tetapi semua yang mereka bina hanyalah rumah. Cuma bahan dan rupa rumah ini berbeza, tetapi ketukangan umum masih sama.

$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();
Salin selepas log masuk

Akhir sekali, mari kita lihat pelaksanaan kami Adakah ia sangat mudah hanya menyediakan pasukan kejuruteraan, menyediakan pembina yang berbeza, dan kemudian menyerahkannya kepada pasukan kejuruteraan untuk pengeluaran! !

  • Malah, masalah utama yang perlu diselesaikan oleh model ini ialah kelas mungkin mempunyai banyak konfigurasi dan atribut ini tidak mesti dikonfigurasikan melaluinya instantiasi sekali sahaja. Pada masa ini, anda boleh mempertimbangkan untuk menjadikan konfigurasi dan sifat ini menjadi bahagian yang boleh ditambah pada bila-bila masa. Dapatkan objek yang berbeza melalui gabungan atribut yang berbeza.
  • Teks asal item di atas dalam GoF ialah: ia membolehkan anda menukar perwakilan dalaman produk; ia memisahkan kod pembinaan dan kod persembahan; proses.
  • Ringkasnya, objek itu terlalu kompleks, kita boleh memasangnya bahagian demi bahagian!
  • Sesiapa sahaja yang tahu sedikit tentang pembangunan Android akan biasa dengannya Mencipta objek dialog AlterDialog.builder
  • Dalam Laravel, komponen pangkalan data juga boleh anda lihat kod sumber DatabaseEloquent dan direktori DatabaseQuery Adakah terdapat Builder.php ), serahkan lukisan dan aksesori kepada pekerja (Pengarah) pada baris pemasangan, dan mereka akan menggunakan aksesori mengikut lukisan untuk menghasilkan pelbagai model mudah alih. telefon (Produk) yang kami perlukan. Jelas sekali bahawa kita semua adalah pembina yang hebat, menambah industri kita! ! !

Kod penuh: https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php

Contoh

Seperti yang dinyatakan sebelum ini, banyak kotak dialog dalam Android dilaksanakan menggunakan mod pembina Sebagai pemilik kilang telefon mudah alih, sistem Android tersuai juga merupakan bahagian yang sangat penting. Sama seperti X Mi, kami bermula dengan MIUI dan memenangi pasaran perisian terlebih dahulu, membuatkan semua orang merasakan bahawa sistem ini sangat mudah digunakan, dan kemudian mula membangunkan telefon bimbit. Ini menunjukkan bahawa perisian dan perkakasan sememangnya merupakan dua komponen terpenting bagi telefon mudah alih moden, dan tiada satu pun boleh bertahan tanpanya. Kali ini, kami akan menggunakan mod pembina untuk hanya melaksanakan satu set komponen dialog!

Rajah kelas dialog

Kod sumber penuh: https://github.com/zhangyue0503/designpatterns-php /blob/master/16.builder/source/builder-dialog.phpAnalisis mendalam tentang corak pembina dalam PHP

Penerangan
<?php

class Dialog
{
    private $attributes = [];
    private $buttons = [];
    private $title = &#39;&#39;;
    private $content = &#39;&#39;;

    public function AddAttributes($attr)
    {
        $this->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, &#39;显示提示框 === &#39;, PHP_EOL;
        echo &#39;标题:&#39; . $this->title, PHP_EOL;
        echo &#39;内容:&#39; . $this->content, PHP_EOL;
        echo &#39;样式:&#39; . implode(&#39;,&#39;, $this->attributes), PHP_EOL;
        echo &#39;按扭:&#39; . implode(&#39;,&#39;, $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(&#39;置于顶层&#39;);
        $builder->BuildAttribute(&#39;居中显示&#39;);

        $builder->BuildButton(&#39;确认&#39;);
        $builder->BuildButton(&#39;取消&#39;);

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

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

        $builder = new DialogBuilder();

        $builder->BuildAttribute(&#39;置于顶层&#39;);
        $builder->BuildAttribute(&#39;居中显示&#39;);
        $builder->BuildAttribute(&#39;背景庶照&#39;);
        $builder->BuildAttribute(&#39;外部无法点击&#39;);

        $builder->BuildButton(&#39;确认&#39;);
        $builder->BuildButton(&#39;取消&#39;);

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

$d1 = new DialogDirector();
$d1->Construct(&#39;窗口1&#39;, &#39;确认要执行操作A吗?&#39;)->GetDialog()->ShowDialog();

$d2 = new ModalDialogDirector();
$d2->Construct(&#39;窗口2&#39;, &#39;确认要执行操作B吗?&#39;)->GetDialog()->ShowDialog();
Salin selepas log masuk
  • Kali ini produk kami agak rumit, dengan tajuk, kandungan, atribut, butang, dll.
  • Proses pembinaan sebenarnya sama, tetapi di sini kami menggunakan pembina yang berbeza. Perkara di luar kotak dialog biasa boleh diklik, tetapi tetingkap modal biasanya mempunyai lapisan topeng, yang bermaksud latar belakang menjadi hitam telus, dan perkara di luar tidak lagi boleh diklik
  • Jika anda lulus terus setiap kali Jika kaedah pembina membuat instantiat kelas tetingkap, akan ada banyak parameter yang akan diluluskan Tetapi sekarang, kita boleh menggabungkannya melalui pembina, supaya objek mempunyai kesan polimorfik dan boleh membentangkan bentuk dan fungsi yang berbeza
Alamat asal: https://juejin.cn/post/6844903981836320781

Pengarang: Pengurus Projek Tegar

Pembelajaran yang disyorkan: "

Video PHP tutorial

Atas ialah kandungan terperinci Analisis mendalam tentang corak pembina dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan