Java构建器模式和更改字段

时间:2018-08-24 06:49:46

标签: java design-patterns builder

我很难弄清楚如何更改由构建器模式创建的对象中的某些字段: 例如,这是课程

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

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

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

    public Pizza build() {
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}

这样就创建了比萨饼对象:

Pizza pizza = new Pizza.Builder(12)
                       .cheese(true)
                       .pepperoni(true)
                       .bacon(true)
                       .build();

现在我要查找的是如何更改此对象 例如奶酪田地假? 我没有getter和setter方法,我知道我可以使用反射,但是这会使代码更难以阅读和理解。 那么,构建器模式对不是最终对象有用吗?

3 个答案:

答案 0 :(得分:3)

构建器模式通常可以用来创建不可变的对象,但是它不需要这样做。如果您希望能够在class C之后更改值,则只需为此添加一个设置器。

答案 1 :(得分:1)

  

如何在此对象(例如,奶酪字段)中将其更改为false?

您应将setter添加到Pizza中,如下所示:

class Pizza {
    //...

    public void setCheese(boolean cheese) {
        this.cheese = cheese;
    }

    @Override
    public String toString() {
        return String.format("cheese: %s", this.cheese);
    }
    //...
}

然后您可以将其用作:

    System.out.println(pizza);
    pizza.setCheese(false);
    System.out.println(pizza);

初始化后,输出:

cheese: true
cheese: false
  

构建器模式对不是最终对象有用吗?

有一些有趣的帖子在讨论Builder PatternThree Reasons Why I Like the Builder PatternWhen would you use the Builder Pattern?

我个人说,这完全取决于您的情况本身。

答案 2 :(得分:0)

Builder类应该具有设置可选参数的方法,并且在设置了可选属性之后,它应该返回相同的Builder对象。 由于“奶酪”是您的可选参数,因此您需要在Builder类中为其设置一个值

public Builder cheese(Boolean cheese) {
            this.cheese = cheese;
            return this;
        }

然后您可以使用:

Pizza pizza1 = new Pizza.Builder(12)
                       .cheese(false)
                       .pepperoni(true)
                       .bacon(true)
                       .build();