ホームページ  >  記事  >  バックエンド開発  >  PHP のビルダー パターンの詳細な分析

PHP のビルダー パターンの詳細な分析

青灯夜游
青灯夜游転載
2021-07-19 19:51:232603ブラウズ

前の記事「 PHP の中間パターンについての簡単な説明」では、PHP の中間パターンについて紹介しました。次の記事では、PHP デザイン パターンのビルダー パターンについて説明します。

PHP のビルダー パターンの詳細な分析

ビルダー モードはジェネレーター モードとも呼ばれます。ビルダーという言葉の本来の意味には、構築者、開発者、作成者という意味が含まれます。明らかに、このモードはオブジェクトの作成に使用される別の作成モードです。では、その特徴は何でしょうか?建築の観点から見ると、家を建てるということはすぐに建てられるものではなく、レンガを一つずつ積み上げていきます。家にはレンガやタイルだけでなく、さまざまなパイプやさまざまなワイヤーなどがあり、それらのさまざまな部品が集まって家を構成しています。ビルダーパターンは、さまざまなコンポーネントからオブジェクト(家)を構成する非常に鮮やかなプロセスであると言えます。

Gof クラス図と説明

GoF 定義: 複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします

GoF クラス図

PHP のビルダー パターンの詳細な分析

コード実装

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;
        }
    }
}

Product クラス、次のように考えることができます。私たちが建てたい家として。現時点では家にはコンテンツがないため、レンガとタイルを追加する必要があります。

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;
    }
}

ビルダーの抽象化とその実装。異なる開発者は常に異なるブランドの材料を使用します。ここでは 2 人の異なる開発者がいますが、家 (製品) を建設するという目的は同じです。

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

コンストラクター。実稼働用のビルダーを呼び出すために使用されます。そうです、それは私たちのエンジニアリングチームです。素材を選んで組み立てていきます。同じエンジニアリング チームがさまざまな注文を引き受けることができますが、彼らが建設するのは住宅だけです。この家の素材と外観が異なるだけで、全体的な職人技は同じです。

$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();

最後に、実装を見てみましょう。それは非常に簡単ですか?エンジニアリング チームを準備し、さまざまなビルダーを準備して、本番環境のためにエンジニアリング チームに引き渡すだけです。 !

  • 実際、このモデルによって解決される主な問題は、クラスに多くの構成と属性が含まれる可能性があることです。これらの構成と属性をすべて構成する必要があるわけではありません。これらは、次の方法で構成できます。これらは非常に面倒です。現時点では、これらの構成とプロパティをいつでも追加できるパーツにすることを検討できます。さまざまな属性の組み合わせによってさまざまなオブジェクトを取得します。
  • GoF における上記の項目の原文は次のとおりです: 製品の内部表現を変更できます; 構築コードとプレゼンテーション コードを分離できます; よりきめ細かい制御が可能になります建設プロセス。
  • 簡単に言うと、オブジェクトは複雑すぎるので、部品ごとに組み立てることができます。
  • Android 開発について少し知っている人なら、ダイアログ オブジェクト AlterDialog.builder の作成に精通しているでしょう。
  • Laravel では、データベース コンポーネントもビルダー モードを使用します。ソース コード \Eloquent ディレクトリと Database\Query ディレクトリに Builder.php はありますか

ご存知のとおり、携帯電話の組み立ては複雑なプロセスなので、対応する携帯電話のモデルがあります。図面(Builder)は組立ラインの作業員(Director)に渡され、彼らは図面に従って付属品を使用して、必要なさまざまなモデルの携帯電話(Product)を生産します。私たち全員が優れたビルダーであり、業界に貢献していることは明らかです。 ! !

#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php

# #例

前述したように、Android のダイアログ ボックスの多くはビルダー モードを使用して実装されていますが、携帯電話工場のオーナーとして、カスタマイズされた Android システムも非常に重要な部分です。 X Miと同じように、私たちはMIUIからスタートして、まずソフトウェア市場を勝ち取り、このシステムが非常に使いやすいと誰もが感じてから、携帯電話の開発を開始しました。これは、ソフトウェアとハ​​ードウェアが確かに現代の携帯電話の 2 つの最も重要なコンポーネントであり、どちらもこれらがなければ生きていけないことを示しています。今回は、ビルダーモードを使用して、ダイアログコンポーネントのセットを単純に実装してみます。

ダイアログ クラス図

PHP のビルダー パターンの詳細な分析

完全なソース コード: https://github.com/zhangyue0503/designpatterns-php /blob/master/16.builder/source/builder-dialog.php

<?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();

説明

  • 今回の製品は、タイトル、コンテンツ、属性、ボタンなどがあり、少し複雑です。
  • 構築プロセスは実際には同じですが、ここでは主に異なるコンストラクターを使用します。通常のダイアログボックスの外側のものはクリックできますが、モーダルウィンドウには通常マスクレイヤーがあり、背景が透明で黒くなり、外側のものはクリックできなくなります
  • 毎回直接渡すとコンストラクター メソッドがウィンドウ クラスをインスタンス化する場合、多くのパラメーターを渡す必要がありますが、ビルダーを介してパラメーターを組み合わせることができるため、オブジェクトに多態性の効果があり、さまざまな形式や機能を表現できます

元のアドレス: https://juejin.cn/post/6844903981836320781

著者: ハードコア プロジェクト マネージャー

推奨学習: 「PHP」ビデオチュートリアル>>

以上がPHP のビルダー パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。