2012-12-27 40 views
2

我在创建一个“部分”可变的对象时发现使用构建器是否是正确的方法,即某些对象的属性是可变的。使用构建器构建“部分”可变对象?

让我们考虑一下这个接口的实现。可以创建对象后改变的最后一个必备参数,一个可选的参数:

public class SimpleGlass implements IGlass { 

    // Mandatory. 
    private final int size; 

    // Optional. 
    private boolean isEmpty; 

    private SimpleGlass(SimpleGlassBuilder builder) { 
     size = builder.getSize(); 
     isEmpty = builder.isEmpty(); 
    } 

    @Override 
    public int getSize() { 
     return size; 
    } 

    @Override 
    public boolean isEmpty() { 
     return isEmpty; 
    } 

    @Override 
    public void setEmpty(boolean isEmpty) { 
     this.isEmpty = isEmpty; 
    } 

    public static class SimpleGlassBuilder { 

     // Mandatory. 
     private final int size; 

     // Optional. 
     private boolean isEmpty = false; 

     public SimpleGlassBuilder(int size) { 
      this.size = size; 
     } 

     public SimpleGlassBuilder setEmpty(boolean isEmpty) { 
      this.isEmpty = isEmpty; 
      return this; 
     } 

     public IGlass build() { 
      return new SimpleGlass(this); 
     } 

     public int getSize() { 
      return size; 
     } 

     public boolean isEmpty() { 
      return isEmpty; 
     } 
    } 
} 

所以生成器所创建可变对象,然而,每当生成器编程文献它是关于一个不可改变的对象提及。

在这种情况下使用建造者可以吗?

+4

构建器模式MAINLY有助于创建可能需要许多设置参数的类的实例,这并不一定意味着您不能为可变对象创建构建器 – frictionlesspulley

回答

7

我会说一个Builder被用于具有很多属性的类,其中大多数是可选的指定。您不是使用一百万个构造函数或一个糟糕的构造函数,而是使用构建器并指定您所需的。

new GlassBuilder(16_OZ).withHandle().withLogo(logo).build() 

// instead of 
new Glass(16_OZ, 
      /* handle? */ true, 
      /* chipped? */ false, 
      /* monogram? */ null, 
      /* something else? */ null, 
      logo); 

可变性是在结束很好,因为可变性是好的,但它实际上并没有影响到生成器是否使你的生活更轻松。

1

我会离开IGlass实现类中的“空”属性,但将其从构建器中删除。有太多的地方来设置价值。此外,如果将其设置在构建器中,则会将该问题混淆,因为仅适用于在该点之后创建的IGlass实例,直到调用其setEmpty()方法为止。

我建议你建立它们,然后在新建的对象实例上设置'空'属性。

设计模式的目的是让事情变得简单易懂。通过增加建设者或实例是否设置'空'属性的额外关切,事情不再那么容易。

+0

好点,但是我将如何(作为客户端)如果我有很多可选的变量参数,在创建对象时做什么?例如,我创建了一个包含两个必需参数,三个可选最终参数和十个可选变量参数的对象。我会为Builder ... build()部分添加一行,然后在十个单独的行上设置其他参数? : - / – htorque