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 的具体实现。