デザインパターン[生成に関する] 06--ビルダーモード(ビルダー)

I.はじめに

それがあるか、ソフトウェアシステムでは、現実の世界では、いくつかの複雑なオブジェクトがあるかどうか、彼らは、ホイール、ステアリングホイール、送信機と他の成分を含む、車などの要素を、複数のを持っています。ほとんどのユーザーのために、これらのコンポーネントの詳細を知らなくてもほとんどの成分を単独で使用、組み立てられているが、完全な車の使用は、設計することができ、そのビルダーモード、ビルダーパターンによって記述組立工程は複雑なオブジェクトを作成するために、ステップバイステップで、分離することができます。ユーザーは、その内部構造の具体的な詳細を知らなくても、オブジェクトを取得することができ、複雑なオブジェクトの型を指定する必要があります。

複雑なオブジェクトを構築するための車と同等であり、オブジェクトのプロパティは、車の一部に対応する、構築プロセスは、成分の組み合わせの方法の生成物に相当します。コンポーネントのプロセスの組み合わせは非常に複雑で、そのため、これらのコンポーネントの組み合わせプロセスは、多くの場合と呼ばれるオブジェクトビルダに「外部化」されているので、ビルダーは、すでに構築された製品の完全なオブジェクトが完了しているクライアントに戻され、ユーザーは必要ありません。オブジェクトは、プロパティおよびその組立方法が含まれている懸念、これはモチベーションビルダーモードのモードがあります。

モデルビルダ(Builderパターン):同一のビルドプロセスが異なる表現を作成することができるように、構築物および複合オブジェクトのその分離を表します。Builderパターンは、ユーザーが唯一の複雑なオブジェクトの種類と内容を指定することにより、ユーザーは建物の内部の具体的な詳細を知る必要はありませんそれらを構築することができますことができます複雑なオブジェクトを作成するためのステップバイステップです。Builderパターンは、オブジェクトの作成モードの種類に属しています。中国の翻訳によっては、だけでなく、Builderパターン・ジェネレータ・モードと呼ばれることができます。

二、シーン

たとえば:KFCに行き、ハンバーガーなどコーラ、フライドポテト、フライドチキンの翼は、一定であり、そのポートフォリオは常にいわゆる生成、変更された「パッケージ」を

使用することが:
1)必要性は、複雑な内部構造を有する物体を生成します。
2)相互依存内部プロパティオブジェクト自体を生成する必要があります。

需要の変化に、この複雑な主題の様々な部分、しばしば、顔、主に、時には通常特定のアルゴリズムでサブオブジェクトの様々な部分から成るワークを作成するために、「複合オブジェクト」、直面、ソフトウェアシステムにおけるビルダーパターンを解決するために急激な変化が、それらを組み合わせたアルゴリズムは比較的安定しています。

第三に、クラス構造

ビルダー・モードは、次の役割が含まれています。

役割 ブリーフ
ビルダー 抽象ビルダー
ConcreteBuilder 具体的なビルダー
ディレクター ディレクター
製品 製品の役割
  • 抽象ビルダーは、製品と復帰方法を作成する方法を定義します。
  • 司令官の効果は主に二つある。一方では、顧客と生産プロセスを分離し、他方では、製品の生成プロセスを制御する責任があります。
  • クライアントが唯一知っている必要があり、特定のビルダーの種類を、あなたが通過することができ、関連するクラスメソッドの指揮官は、ビルダーは、完全な製品のターゲットを返し呼び出します

四、UMLダイアグラム

2021264-4517b441af74a31b.png

V.コード分析

ここでは例えば自動車を構築します。

1、抽象ビルダー

interface BuilderInterface
{
    public function createVehicle();

    public function addWheel();

    public function addEngine();

    public function addDoors();

    public function getVehicle();
}

2、特定のビルダー

// 建造大卡车
class TruckBuilder implements BuilderInterface
{
    /**
     * @var Truck
     */
    private $truck;

    public function createVehicle(){
        $this->truck = new Truck();
    }

    public function addDoors(){
        $this->truck->setPart('rightDoor', new Door());
        $this->truck->setPart('leftDoor', new Door());
        $this->truck->setPart('trunkLid', new Door());
    }

    public function addEngine(){
        $this->truck->setPart('truckEngine', new Engine());
    }

    public function addWheel(){
        $this->truck->setPart('wheel1', new Wheel());
        $this->truck->setPart('wheel2', new Wheel());
        $this->truck->setPart('wheel3', new Wheel());
        $this->truck->setPart('wheel4', new Wheel());
        $this->truck->setPart('wheel5', new Wheel());
        $this->truck->setPart('wheel6', new Wheel());
    }

    public function getVehicle(){
        return $this->truck;
    }
}

// 建造小汽车
class CarBuilder implements BuilderInterface
{
    /**
     * @var Car
     */
    private $car;

    public function createVehicle(){
        $this->car = new Car();
    }

    public function addDoors(){
        $this->car->setPart('rightDoor', new Door());
        $this->car->setPart('leftDoor', new Door());
    }

    public function addEngine(){
        $this->car->setPart('engine', new Engine());
    }

    public function addWheel(){
        $this->car->setPart('wheelLF', new Wheel());
        $this->car->setPart('wheelRF', new Wheel());
        $this->car->setPart('wheelLR', new Wheel());
        $this->car->setPart('wheelRR', new Wheel());
    }

    public function getVehicle(){
        return $this->car;
    }
}

図3に示すように、導体

/**
 * Director 类是建造者模式的一部分。 它可以实现建造者模式的接口
 * 并在构建器的帮助下构建一个复杂的对象
 *
 * 您也可以注入许多构建器而不是构建更复杂的对象
 */
class Director
{
    public function build(BuilderInterface $builder)
    {
        $builder->createVehicle();
        $builder->addDoors();
        $builder->addEngine();
        $builder->addWheel();

        return $builder->getVehicle();
    }
}

4、製品の役割

// 抽象产品
abstract class Vehicle
{
    /**
     * @var object[]
     */
    private $data = [];

    /**
     * @param string $key
     * @param object $value
     */
    public function setPart($key, $value){
        $this->data[$key] = $value;
    }
}

class Truck extends Vehicle{
}
class Car extends Vehicle{
}

// 产品部件
class Engine{
}
class Wheel{
}
class Door{
}

5、ユースケース

$diretor = new Director();
$myTruck = $diretor->build(new TruckBuilder());
$myCar = $diretor->build(new CarBuilder());

var_dump($myTruck);
var_dump($myCar);

出力:

object(Truck)#3 (1) {
  ["data":"Vehicle":private]=>
  array(10) {
    ["rightDoor"]=>
    object(Door)#4 (0) {
    }
    ["leftDoor"]=>
    object(Door)#5 (0) {
    }
    ["trunkLid"]=>
    object(Door)#6 (0) {
    }
    ["truckEngine"]=>
    object(Engine)#7 (0) {
    }
    ["wheel1"]=>
    object(Wheel)#8 (0) {
    }
    ["wheel2"]=>
    object(Wheel)#9 (0) {
    }
    ["wheel3"]=>
    object(Wheel)#10 (0) {
    }
    ["wheel4"]=>
    object(Wheel)#11 (0) {
    }
    ["wheel5"]=>
    object(Wheel)#12 (0) {
    }
    ["wheel6"]=>
    object(Wheel)#13 (0) {
    }
  }
}
object(Car)#14 (1) {
  ["data":"Vehicle":private]=>
  array(7) {
    ["rightDoor"]=>
    object(Door)#15 (0) {
    }
    ["leftDoor"]=>
    object(Door)#16 (0) {
    }
    ["engine"]=>
    object(Engine)#17 (0) {
    }
    ["wheelLF"]=>
    object(Wheel)#18 (0) {
    }
    ["wheelRF"]=>
    object(Wheel)#19 (0) {
    }
    ["wheelLR"]=>
    object(Wheel)#20 (0) {
    }
    ["wheelRR"]=>
    object(Wheel)#21 (0) {
    }
  }
}

シックス・特長

1、の利点:

  • ビルダーモードでは、クライアントは、製品の内部構成、製品自体と同じ作成プロセスが異なる製品のオブジェクトを作成できるように切り離さ製品を作成するプロセスの詳細を知る必要はありません。
  • それぞれの具体的なビルダーは関係なく、他の特定のビルダーの、比較的独立しているので、あなたは簡単にユーザーが異なる製品のオブジェクトを取得することができます別の具体的なビルダーを使用し、特定のビルダーを交換したり、新しいコンクリートのビルダーを追加することができます。
  • あなたはより細かく、製品の作成プロセスを制御することができます。より明確かつ簡単なの作成は、作成プロセスを制御するためのプログラムを使用するように、さまざまな方法で複雑な分解生成物を生成するステップ。
  • 沿って、抽象ビルダークラスのプログラミングシステム用の拡張クラスの指揮官を容易にするため、元のクラスライブラリのコードを変更せずに新しいコンクリートのビルダーを追加「開閉の原則。」

2.短所:

  • 共通に持っている必要があります製品は、範囲が限られています。
  • 複雑な内部の変更として、建設クラスの多くがあるでしょう。

3.注:
工場出荷時のパターンの違いは次のとおりです。Builderのモードより多くの注目を組立部品の順に。

ます。https://www.jianshu.com/p/972e405b1d10で再現

おすすめ

転載: blog.csdn.net/weixin_34235105/article/details/91263539