前の記事「 PHP の中間パターンについての簡単な説明」では、PHP の中間パターンについて紹介しました。次の記事では、PHP デザイン パターンのビルダー パターンについて説明します。
ビルダー モードはジェネレーター モードとも呼ばれます。ビルダーという言葉の本来の意味には、構築者、開発者、作成者という意味が含まれます。明らかに、このモードはオブジェクトの作成に使用される別の作成モードです。では、その特徴は何でしょうか?建築の観点から見ると、家を建てるということはすぐに建てられるものではなく、レンガを一つずつ積み上げていきます。家にはレンガやタイルだけでなく、さまざまなパイプやさまざまなワイヤーなどがあり、それらのさまざまな部品が集まって家を構成しています。ビルダーパターンは、さまざまなコンポーネントからオブジェクト(家)を構成する非常に鮮やかなプロセスであると言えます。
GoF 定義: 複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします
GoF クラス図
コード実装
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();
最後に、実装を見てみましょう。それは非常に簡単ですか?エンジニアリング チームを準備し、さまざまなビルダーを準備して、本番環境のためにエンジニアリング チームに引き渡すだけです。 !
ご存知のとおり、携帯電話の組み立ては複雑なプロセスなので、対応する携帯電話のモデルがあります。図面(Builder)は組立ラインの作業員(Director)に渡され、彼らは図面に従って付属品を使用して、必要なさまざまなモデルの携帯電話(Product)を生産します。私たち全員が優れたビルダーであり、業界に貢献していることは明らかです。 ! !
#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php# #例
完全なソース コード: https://github.com/zhangyue0503/designpatterns-php /blob/master/16.builder/source/builder-dialog.php
説明<?php class Dialog { private $attributes = []; private $buttons = []; private $title = ''; private $content = ''; 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, '显示提示框 === ', PHP_EOL; echo '标题:' . $this->title, PHP_EOL; echo '内容:' . $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('确认'); $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('外部无法点击'); $builder->BuildButton('确认'); $builder->BuildButton('取消'); $builder->BuildTitle($title); $builder->BuildContent($content); return $builder; } } $d1 = new DialogDirector(); $d1->Construct('窗口1', '确认要执行操作A吗?')->GetDialog()->ShowDialog(); $d2 = new ModalDialogDirector(); $d2->Construct('窗口2', '确认要执行操作B吗?')->GetDialog()->ShowDialog();ログイン後にコピー
- 今回の製品は、タイトル、コンテンツ、属性、ボタンなどがあり、少し複雑です。
- 構築プロセスは実際には同じですが、ここでは主に異なるコンストラクターを使用します。通常のダイアログボックスの外側のものはクリックできますが、モーダルウィンドウには通常マスクレイヤーがあり、背景が透明で黒くなり、外側のものはクリックできなくなります
- 毎回直接渡すとコンストラクター メソッドがウィンドウ クラスをインスタンス化する場合、多くのパラメーターを渡す必要がありますが、ビルダーを介してパラメーターを組み合わせることができるため、オブジェクトに多態性の効果があり、さまざまな形式や機能を表現できます
元のアドレス: https://juejin.cn/post/6844903981836320781
著者: ハードコア プロジェクト マネージャー
推奨学習: 「PHP」ビデオチュートリアル>>
以上がPHP のビルダー パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。