2012-04-29 112 views
1
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(),它是比薩的具體實現。

+6

你永遠如果你一直迴避具體的類做成任何事情。你必須在某個時候開始使用它們。 –

+0

沒有這個例子借給本身生成器模式?我現在會一路狂飆...... –

回答

0

據我,DIP適用主程序部分內。你不得不懷疑:

那是哪裏traduces我的目標代碼?

在你的情況,你的目標是讓在遵循一些規則,並且不依賴於你正在建設什麼樣的比薩餅知識創造比薩餅。

因此,DIP應適用於您的PizzaStore類。但是,你用它來實現這一目標的所有類,僅僅是某些種類的「插件」,因此,有是沒有強制性要求使用DIP。

事實上,所有類型的項目中,必須有一系列簡單的if/else包含具體的類otherwize你永遠無法與成​​品最終的至少一處。即使是最完美的代碼也不能100%「抽象」。