4

在构建器模式中,所有具体构建器是否都返回相同类型的对象(每个对象具有不同的属性)或者它们的构建器是否都返回某个其他类的子类?

例如,在汽车建造者中,建造者会全部返回汽车对象,还是建造者返回诸如“luxurycar”、“economyCar”、“sportsCar”等类型的对象,它们都继承自汽车?如果后一种情况是正确的,那么构建器如何将唯一属性添加到它创建的子类对象中?

4

2 回答 2

1

您可以结合 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()用户稍后取消设置。

于 2013-11-07T16:26:45.373 回答
1

如果您谈论的是《四人帮》书中的经典 Builder 模式,通常它会返回一个 Product。没有理由不能构建不同的类型,但是由于您将通过基类返回项目,因此必须在强制转换或实例之后访问特化。

如果你想简单地支持基于不同选项等构建不同类型汽车的想法,工厂方法可能是一个更好的匹配。

如果你正在做一个 Fluent Interface Builder,子类型将是一个拖累,因为你正在链接调用。

通常,当构造涉及不同的操作时,Builder 是适用的。导演知道如何操纵建造者来建造产品。您可以让导演对不同类型有特殊的了解。整个想法是,Director 正在向产品的消费者隐藏构造细节。

于 2013-11-07T05:53:09.080 回答