修改Builder模式,是不是很好的做法?

时间:2017-01-17 19:57:19

标签: java factory static-methods builder

我正在尝试在代码中建立强制条件。代码如下:

public class Foo {
   public Type;
   public int planeId;
   public int carId;
   public int capacity;
   public String manufacturer;
   public int serialId;
   .. etc
}

现在Type是一个枚举,AIRPLANE和CAR为2个值。条件是如果Type是平面,则需要填充planeId,否则必须填充CarId。由于class Foo有许多参数,我们选择了构建模式。

 public static class Builder {

    public Builder(public Type type, int id) {
        if (type == PLANE) {
          planeId = id;
        } else {
          carId = id;
        }
    }

但后来我有一个想法将静态工厂融合到构建器模式

public static class Builder {

   public static Builder getPlaneBuilder(int id) {
     return new Builder(PLANETYPE, id); // calls private constructor

   }

   public static Builder getCarBuilder(int id) {
     return new Builder(CARTYPE, id);  // calls private constructor
}

我从未见过静电工厂融入建筑商,但他们似乎做得很好。任何意见 ?批评?更好的解决方

1 个答案:

答案 0 :(得分:1)

  

条件是如果Type是plane,那么planeId需要   填充,否则必须填充CarId。

如果carId用于Car对象而planeId用于Plane对象,那么您是否应该有两个不同的类来处理它们并仅在这些字段声明这些字段的位置要求? 在两个类中添加仅在单个类中相关的字段可能是不可取的。它降低了阶级领域的凝聚力。

关于您的问题,使用工厂方法当然是个好主意。 当您想要控制实例的创建时,通常很有用(对于您而言,构建器已经是这种情况) 但是,如果您有多种构造对象的方法,并且构造函数没有传达有关您要创建的内容的足够信息,那么它也很有用。

例如,这是一个很好的例子:

   public static Builder getPlaneBuilder(int id) {
     return new Builder(PLANETYPE, int id); // calls private constructor
   }

来自客户端代码getPlaneBuilder(int id)public Builder(public Type type, int id)更有意义。