Factory Method是否违反了依赖倒置原则?

时间:2012-04-29 20:44:50

标签: java dependency-inversion

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依赖于披萨抽象,因为它们扩展了它。

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

1 个答案:

答案 0 :(得分:0)

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

引导我的目标的代码在哪里?

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

因此,DIP应该应用于您的PizzaStore类。但是,您用来实现这一目标的所有类都只是某种“插件”,因此,没有必要使用DIP。

事实上,在所有类型的程序中,必须至少有一个地方可用于简单的if / else系列包含具体类别,而这些类别可能永远不会以最终产品结束。即使是最完美的代码也不能100%“抽象”。