在Builder模式中,所有具体构建器都返回相同类型的对象(每个对象具有不同的属性)或者它们的构建器是否都返回其他类的sublcass?
例如,在汽车制造商中,建造者是否都会返回汽车对象 或建筑商会返回类型的物品,如“luxurycar”,“economyCar”,“sportsCar”等都是从车上继承的?如果后一种情况是正确的,那么构建器如何向它创建的子类对象添加唯一属性?
答案 0 :(得分:1)
如果您正在谈论Gang of Four书中的经典Builder模式,通常它会返回一个Product。没有理由不能构建不同的类型,但由于您将通过基类返回项目,因此必须在演员或实例之后访问特化。
如果您想简单地支持基于不同选项等构建不同类型汽车的想法,工厂方法可能是更好的匹配。
如果您正在使用Fluent Interface Builder,那么子类型将会拖延,因为您正在进行链接调用。
通常,当施工涉及不同的操作时,Builder适用。 Director知道如何操纵Builders来构建产品。您可以让Director对不同类型有特殊了解。整个想法是,主任正在掩盖产品消费者的建筑细节。
答案 1 :(得分:1)
您可以组合构建器和抽象工厂模式,并创建可以返回不同类型的构建器。我一直这样做。
它甚至不限于子类,没有理由为什么构建器的build()方法不能返回接口。这可能会导致每次调用build()
返回该接口的不同实现,具体取决于通过方法调用设置的构建器配置。
示例:
public interface MyInterface{
...
}
public class MyBuilder{
//builder methods to set values
//and configurations to figureout what KIND
// of MyInterface implementation to build
...
public MyInterface build(){
if (data can fit in memory){
return new BasicImpl( ...);
}
if(can't fit all in memory){
return new ProxyImpl(...);
}
... etc
}
}
编辑:使用你的汽车示例:
public interface Car{
}
public class CarBuilder{
Builder engine(EngineType engine){
//set the engine type
return this;
}
Builder numberOfPassengers(int n){
...
return this;
}
Builder interior(Color color, InteriorType type){
//interior type is leather, cloth etc
return this;
}
...
public Car build(){
if(is a sporty type of engine, and can only fit a few people){
return new SportsCar(....);
}
if(has expensive options set and is not a sports car){
return new LuxuryCar(....);
}
.... etc
}
}
回答你的另一个问题:构建器如何为子类对象添加唯一属性,答案是它必须知道所有子类属性并允许用户设置它们。您可以添加运行时检查以确保仅为要返回的特定子类正确设置属性。 (您可以快速失败并在setter方法中抛出IllegalStateException或等待build()
,以防用户稍后取消设置。