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(高電平分量)取決於比薩餅(低層組件)的具體實現。
爲了解決這個問題,我們使用Factory Method模式。
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(高級別部分)只依賴於比薩具體的類,並且還具體比薩餅取決於比薩餅抽象,因爲他們擴展它的比薩抽象。
我的問題是:是否NYPizzaStore類也違反了「依賴倒置原則」,因爲它依賴於CheesePizza()和VeggiePizza(),它是比薩的具體實現。
你永遠如果你一直迴避具體的類做成任何事情。你必須在某個時候開始使用它們。 –
沒有這個例子借給本身生成器模式?我現在會一路狂飆...... –