在构建器模式中,所有具体构建器是否都返回相同类型的对象(每个对象具有不同的属性)或者它们的构建器是否都返回某个其他类的子类?
例如,在汽车建造者中,建造者会全部返回汽车对象,还是建造者返回诸如“luxurycar”、“economyCar”、“sportsCar”等类型的对象,它们都继承自汽车?如果后一种情况是正确的,那么构建器如何将唯一属性添加到它创建的子类对象中?
在构建器模式中,所有具体构建器是否都返回相同类型的对象(每个对象具有不同的属性)或者它们的构建器是否都返回某个其他类的子类?
例如,在汽车建造者中,建造者会全部返回汽车对象,还是建造者返回诸如“luxurycar”、“economyCar”、“sportsCar”等类型的对象,它们都继承自汽车?如果后一种情况是正确的,那么构建器如何将唯一属性添加到它创建的子类对象中?
您可以结合 Builder 和 Abstract Factory Patterns 并制作一个可以返回不同类型的 Builder。我一直都这样做。
它甚至不限于子类,你的构建器的 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()
用户稍后取消设置。
如果您谈论的是《四人帮》书中的经典 Builder 模式,通常它会返回一个 Product。没有理由不能构建不同的类型,但是由于您将通过基类返回项目,因此必须在强制转换或实例之后访问特化。
如果你想简单地支持基于不同选项等构建不同类型汽车的想法,工厂方法可能是一个更好的匹配。
如果你正在做一个 Fluent Interface Builder,子类型将是一个拖累,因为你正在链接调用。
通常,当构造涉及不同的操作时,Builder 是适用的。导演知道如何操纵建造者来建造产品。您可以让导演对不同类型有特殊的了解。整个想法是,Director 正在向产品的消费者隐藏构造细节。