我想知道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();
}
答案 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的实际实现将确保构建不同的产品。这些产品可能属于同一类型,也可能属于不同类型。