2016-09-27 5 views
0

ビルダーパターンに複数のディレクターを含めることができますか?なぜなら私は異なる実装を持つオブジェクトを構築しなければならないからです。ビルダーパターン複数のディレクター

例えば、

はいつか目的は、スラグから構成されているので、オブジェクトに異なるスラグを追加するためのforeachを使用しなければなりません。

//Director 1 

function build ($obj) { 
    foreach($slugs as $slug) { 
     $object = $obj->createObject($slug); 
     $object->buildItem1(); 
     $object->buildItem2(); 
    } 
} 

しかし、他の回はオブジェクトがすべての行から構築されます。

//Director 2 

function build ($obj) { 
    $object = $obj->createObject(); 
    $object->buildItem1(); 
    $object->buildItem2(); 
} 

答えて

0

あなたは書きました:

を私は異なる実装を持つオブジェクトを構築する必要があります。

異なるクラスの異なる実装オブジェクトを持つオブジェクトではありませんか?

the builder patternには、実際の建物を担当するDirectorオブジェクトがあります。コンクリートビルダーオブジェクトをインスタンス化して、必要な製品をビルドし、ディレクターにコンコースビルダーを使用してオブジェクトをビルドするよう依頼します。

コンクリートビルダーは、クラスビルダーから派生しているか、またはIBuildインターフェースを実装しています。ディレクターはビルダーを構築する方法を知っており、適切な機能を呼び出して製品を構築します。

典型的な例は、オートバイと自動車を作りたい場合です。 2つの派生クラスMotorCycleBuilderとCarBuilderを持つクラスまたはインタフェースVehicleBuilderがあります。製品として必要なものに応じて、MotorCycleBuilderまたはCarBuilderを構築し、ディレクトリを注文して製品をビルドします。

に戻るあなたは、製品Aと製品Bの2種類の製品を作りたいと思っています。製品は同じクラスでも、異なるクラスでもよいでしょう。

ビルダーパターンを使用する場合は、ABuilderとBBuilderを設計する必要があります。 ABuilderは製品Aを提供し、BBuildersは製品Bを提供します.AbuilderとBBuilderは両方ともBuilderから派生しているか、またはIBuildのような共通インタフェースを持っています

これで、製品AまたはAをビルドするかどうかを決定しました。製品Bあなたは次のようにします。

Builder myBuilder = isProductARequested ? new ABuilder() : new BBuilder(); 
Director myDirector = new Director(); 
Product myProduct = myDirector.Build(myBuilder); 

今、あなたはBuildStep1を(行う必要があり、あなたの製品を構築すると仮定)とBuildStep2()、その後、ABuilderとBBuilderの両方が、これらの機能と、これらの機能とIBuildインタフェースを実装する必要があり、または関数BuildStep1()とBuildStep2()を持つ抽象クラスから派生します。

BuildStep1とBuildStep2の実際の実装は、別の製品がビルドされていることを確認します。これらの製品は、同じタイプまたは異なるタイプの製品である可能性があります。

関連する問題