Builder模式不止一个导演

时间:2016-09-27 06:49:28

标签: design-patterns builder

我想知道Builder Pattern是否可以拥有多个Director?因为我必须构建一个具有不同实现的对象。

例如,

有时候对象是用slug构造的,所以我必须使用foreach来为对象添加不同的slu ..

//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();
}

1 个答案:

答案 0 :(得分:0)

您写道:

  

我必须构建一个具有不同实现的对象。

Aren的对象有不同类的不同实现对象吗?

根据几个来源the builder pattern有一个Director对象来完成实际建筑。您实例化一个具体的构建器对象,它可以构建您想要的产品,并要求Director使用concree-builder来构建对象。

具体构建器派生自类构建器或imlements 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的实际实现将确保构建不同的产品。这些产品可能属于同一类型,也可能属于不同类型。