【问题标题】:Does Factory Method violate the dependency inversion principle?工厂方法是否违反依赖倒置原则?
【发布时间】:2012-05-09 16:32:21
【问题描述】:
public class DependentPizzaStore {
  public Pizza createPizza(String type) {
    Pizza pizza = null;
    if (Style.equals("NY")) {
      if (type.equals("cheese")) {
        pizza = new NYStyleCheesePizza();
      }
      else if(type.equals("Veggie")){
        pizza = new NYStyleVeggiePizza();
      }
    }

    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
  }
}

Headfirst Design Patterns 中的这个示例违反了“依赖倒置原则”,即“依赖于抽象。不依赖于具体类”。

上面的例子违反了规则,因为 DependentPizzaStore(高级组件)依赖于比萨(低级组件)的具体实现。

为了解决这个问题,我们使用工厂方法模式。

public abstract class PizzaStore {
  protected abstract Pizza createPizza(String item);
  public Pizza orderPizza(String type) {
    Pizza pizza = createPizza(type);
    System.out.println("--- Making a " + pizza.getName() + " ---");
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
  }

  public class NYPizzaStore extends PizzaStore {
    protected Pizza createPizza(String item) {
      Pizza pizza = null;
      if (item.equals("cheese")) {
        pizza = new CheesePizza();
      } else if (item.equals("veggie")) {
        pizza = new VeggiePizza();
      }
      return pizza;
    }   
  }

现在 PizzaStore(高级组件)仅依赖于 Pizza 具体类的 Pizza 抽象,而且具体 Pizzas 依赖于 Pizza 抽象,因为它们扩展了它。

我的问题是:NYPizzaStore 类是否也违反了“依赖倒置原则”,因为它依赖于 CheesePizza() 和 VeggiePizza(),它们是 Pizza 的具体实现。

【问题讨论】:

  • 如果你一直避开具体的课程,你将永远无法完成任何事情。你必须在某个时候开始使用它们。
  • 这个例子不适合建造者模式吗?我现在就拖着...

标签: java dependency-inversion


【解决方案1】:

据我说,DIP 适用于您的主程序部分。你不得不怀疑:

违反我的目标的代码在哪里?

在您的情况下,您的目标是允许创建披萨,同时遵循一些规则,而不依赖于您正在制作的披萨的知识。

因此,应将 DIP 应用于您的 PizzaStore 类。但是你用来实现这个目标的所有类,只是一些“插件”,因此,没有强制需要使用 DIP。

确实,在所有类型的程序中,必须至少有一个位置用于包含具体类的简单 if/else 系列,否则您将永远无法完成成品。即使是最完美的代码也不可能是 100% 的“抽象”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2021-08-24
    • 2013-07-08
    相关资源
    最近更新 更多