Design patterns 生成器模式:所有生成器是否返回相同的类型?

Design patterns 生成器模式:所有生成器是否返回相同的类型?,design-patterns,builder,Design Patterns,Builder,在构建器模式中,所有具体的构建器都返回相同类型的对象(每个对象具有不同的属性),还是每个构建器都返回某个其他类的子类 例如,在汽车生成器中,生成器是否都返回汽车对象 或者,建筑商是否会返回“luxurycar”、“economyCar”、“sportsCar”等类型的对象,这些对象都是从汽车继承的?如果后一种情况是正确的,那么构建器如何向其创建的子类对象添加唯一属性 如果您在谈论四人帮(GangofFour)一书中的经典构建器模式,通常它会返回一个产品。没有理由不能构建不同的类型,但是由于将通过

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

例如,在汽车生成器中,生成器是否都返回汽车对象
或者,建筑商是否会返回“luxurycar”、“economyCar”、“sportsCar”等类型的对象,这些对象都是从汽车继承的?如果后一种情况是正确的,那么构建器如何向其创建的子类对象添加唯一属性

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

如果你想简单地支持根据不同的选择制造不同类型的汽车的想法,那么工厂方法可能是更好的匹配

如果您使用的是Fluent Interface 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()
,以防用户稍后将其取消设置。

在经典模式中,“产品”是单个类吗?(即所有产品是否属于同一类)是的。考虑一些类似于Car的东西。生成器将有一个私有成员,然后调用一个方法,例如,GETCARE()。这个想法是,如果你必须安装引擎,添加轮子,等等,这些都是构建器上的方法,作为构建协议的一部分被调用,最后调用get product方法来返回构建工作的结果。