2016-09-27 62 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有一個主任對象誰做的實際建設。你實例化一個具體構建器對象,它可以構建你想要的產品,並要求導演使用concree構建器來構建對象。

混凝土生成器是從類構建器派生而來的,或者實現了一個IBuild接口。導演知道如何建造建築商,並會調用適當的功能來建造產品。

一個典型的例子是如果你想能夠建造摩托車和汽車。你有一個類或接口VehicleBuilder與兩個派生類MotorCycleBuilder和CarBuilder。根據您希望作爲產品的需求構建MotorCycleBuilder或CarBuilder,並命令目錄構建產品。

回到你的問題。您希望能夠構建兩種產品:產品A和產品B.產品可能屬於同一類別,也可能屬於不同類別。

如果您想爲此使用構建器模式,您必須設計一個ABuilder和一個BBuilder。 ABuilders將提供產品A和BBuilders將提供產品B. ABuilder和BBuilder都來自Builder,或者至少有一個通用接口,如IBuild

現在,一旦您決定是要構建產品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的實際實現將確保生成不同的產品。這些產品可能具有相同類型或不同類型。