微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有抽象类的构建器模式

如何解决带有抽象类的构建器模式

我正在尝试使用 Pizza 示例来学习和实现构建器模式。

我正在尝试扩展解决方案,我必须再完成 1 件事:

用户应该能够订购特定的比萨(夏威夷、肉类、素食 ) 中进行了一些自定义。示例 --> 在肉比萨中 --> 加入鸡肉 + 培根

寻找关于以更简洁的方式实现这一点的建议(避免 if-else)

这是我的 Pizza 和 PizzaBuilder 类:

public class Pizza {

  private String dough;
  private String sauce;
  private String toppings;

  public Pizza(PizzaBuilder pizzaBuilder) {
    this.dough = pizzaBuilder.dough;
    this.sauce = pizzaBuilder.sauce;
    this.toppings = pizzaBuilder.toppings;
  }

  public void setDough(String dough) {
    this.dough = dough;
  }

  public void setSauce(String sauce) {
    this.sauce = sauce;
  }

  public void setToppings(String toppings) {
    this.toppings = toppings;
  }

  abstract static class PizzaBuilder {
    private String dough;
    private String sauce;
    private String toppings;
    protected Pizza pizza;

    abstract void addDough();
    abstract void addSauce();
    abstract void addToppings();

    public PizzaBuilder addDough(String dough) {
      this.dough = dough;
      return this;
    }

    public PizzaBuilder addSauce(String sauce) {
      this.sauce = sauce;
      return this;
    }

    public PizzaBuilder addToppings(String toppings) {
      this.toppings = toppings;
      return this;
    }

    public Pizza bakeAPizza() {
      return pizza;
    }

    public PizzaBuilder makeAPizza() {
      getPizza();
      this.addDough();
      this.addSauce();
      this.addToppings();
      return this;
    }

    public PizzaBuilder getPizza() {
      pizza = new Pizza(this);
      return this;
    }
  }

  @Override
  public String toString() {
    return "Pizza{" + "dough='" + dough + '\'' + ",sauce='" + sauce + '\'' + ",toppings='" + toppings + '\'' + '}';
  }
}

这是我的 MeatPizzaBuilder 类:

public class MeatPizzaBuilder extends PizzaBuilder {

  @Override
  void addDough() {
    pizza.setDough("Italian Wheat");
  }

  @Override
  void addSauce() {
    pizza.setSauce("mustard");
  }

  @Override
  void addToppings() {
    pizza.setToppings("Meat");
  }
}

类似于 MeatPizzaBuilder:我有 HawaainPizzaBuilder、VeggiePizzaBuilder 和 GenericPizzaBuilder。这是我的 GenericPizzaBuilder 类:

   public class GenericPizzaBuilder extends PizzaBuilder {

  @Override
  void addDough() {

  }

  @Override
  void addSauce() {

  }

  @Override
  void addToppings() {

  }
}

最后是 PizzaShop(主要方法

public class PizzaShop {
    public static void main(String[] args) {

      Pizza hawaiinPizza = new HawaainPizzaBuilder().makeAPizza().bakeAPizza();
      Pizza meatPizza = new MeatPizzaBuilder().makeAPizza().bakeAPizza();
      Pizza veggiePizza = new VeggiePizzaBuilder().makeAPizza().bakeAPizza();
      Pizza genericPizza = new GenericPizzaBuilder()
          .addDough("Test")
          .addSauce("Test Sauce")
          .addToppings("All Veggeis minus brocolli")
          .getPizza()
          .bakeAPizza();

      System.out.println("Here is your Hawaiin Pizza: "+ hawaiinPizza.toString());
      System.out.println("Here is your Meat Pizza: "+ meatPizza.toString());
      System.out.println("Here is your Veggie Pizza: "+ veggiePizza.toString());
      System.out.println("Here is your Generic Pizza: "+ genericPizza.toString());
    }
}

所以用户应该能够说:

我想吃鸡肉披萨

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。