【发布时间】: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 的具体实现。
【问题讨论】:
-
如果你一直避开具体的课程,你将永远无法完成任何事情。你必须在某个时候开始使用它们。
-
这个例子不适合建造者模式吗?我现在就拖着...