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 (上位コンポーネント) は、Pizza 具象クラスの Pizza 抽象化のみに依存しており、具象 Pizza もピザの抽象化を拡張しているため、Pizza 抽象化に依存しています。
私の質問は: NYPizzaStore クラスは、Pizza の具体的な実装である CheesePizza() と VeggiePizza() に依存しているため、「依存性反転原則」にも違反していますか。