构建器模式:所有构建器都返回相同的类型吗?

时间:2013-11-07 03:34:00

标签: design-patterns builder

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

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

2 个答案:

答案 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(),以防用户稍后取消设置。