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的具体实现。
答案 0 :(得分:0)
据我所知,DIP适用于您的主程序部分。你不得不怀疑:
引导我的目标的代码在哪里?
在您的情况下,您的目标是允许在遵循一些规则的同时创建披萨,而不依赖于您正在构建的披萨的知识。
因此,DIP应该应用于您的PizzaStore类。但是,您用来实现这一目标的所有类都只是某种“插件”,因此,没有必要使用DIP。
事实上,在所有类型的程序中,必须至少有一个地方可用于简单的if / else系列包含具体类别,而这些类别可能永远不会以最终产品结束。即使是最完美的代码也不能100%“抽象”。