[英]object dependency on to concrete classes
我試圖理解抽象工廠模式,而這真的很難。 我從 Head First Design Patterns 書中看到了以下示例,試圖描述依賴關系以及為什么依賴是不好的。 但是,我不理解該代碼示例的以下說法。
因為對比薩餅具體實現的任何更改都會影響
DependentPizzaStore
,所以我們說DependentPizzaStore
“依賴於”比薩餅實現。
我真的不明白它如何影響 class 它只是由new
s 啟動並使用bake
, cut
等方法。 DependentPizzaStore
對具體實現一無所知。
public class DependentPizzaStore {
public Pizza createPizza(String style, String type) {
Pizza pizza = null;
if (style.equals("NY")) {
if (type.equals("cheese")) {
pizza = new NYStyleCheesePizza();
} else if (type.equals("veggie")) {
pizza = new NYStyleVeggiePizza();
} else if (type.equals("clam")) {
pizza = new NYStyleClamPizza();
} else if (type.equals("pepperoni")) {
pizza = new NYStylePepperoniPizza();
}
} else if (style.equals("Chicago")) {
if (type.equals("cheese")) {
pizza = new ChicagoStyleCheesePizza();
} else if (type.equals("veggie")) {
pizza = new ChicagoStyleVeggiePizza();
} else if (type.equals("clam")) {
pizza = new ChicagoStyleClamPizza();
} else if (type.equals("pepperoni")) {
pizza = new ChicagoStylePepperoniPizza();
}
} else {
System.out.println("Error: invalid type of pizza");
return null;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
DependentPizzaStore
需要明確了解所有實現才能初始化它們。 因此DependentPizzaStore
依賴於這些實現並緊密耦合。 如果這些實現的構造函數中的任何一個要更改,那么您還需要更改DependentPizzaStore
抽象工廠將允許您提供一個接口來創建相關或依賴對象的系列,而無需指定它們的具體類。
因為你的例子也有不同的披薩styles
public interface PizzaFactory {
string getStyle();
Pizza createPizza(String type);
}
那么對於不同的styles就需要不同的工廠了。
public class NYStylePizzaFactory implements PizzaFactory {
public string getStyle() { return "NY"; }
public Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new NYStyleCheesePizza();
} else if (type.equals("veggie")) {
pizza = new NYStyleVeggiePizza();
} else if (type.equals("clam")) {
pizza = new NYStyleClamPizza();
} else if (type.equals("pepperoni")) {
pizza = new NYStylePepperoniPizza();
}
if(pizza == null){
//...throw?
}
return pizza;
}
}
public class ChicagoStylePizzaFactory implements PizzaFactory {
public string getStyle() { return "Chicago"; }
public Pizza createPizza(String type) {
if (type.equals("cheese")) {
pizza = new ChicagoStyleCheesePizza();
} else if (type.equals("veggie")) {
pizza = new ChicagoStyleVeggiePizza();
} else if (type.equals("clam")) {
pizza = new ChicagoStyleClamPizza();
} else if (type.equals("pepperoni")) {
pizza = new ChicagoStylePepperoniPizza();
}
if(pizza == null){
//...throw?
}
return pizza;
}
}
DependentPizzaStore
現在可以將創建披薩的任務委托給工廠,而無需了解任何有關實現細節。
public class DependentPizzaStore {
List<PizzaFactory> factories;
public DependentPizzaStore(List<PizzaFactory> factories) {
this.factories = factories;
}
public Pizza createPizza(String style, String type) {
Pizza pizza = null;
for (PizzaFactory factory : factories) {
if (factory.getStyle().equals(style)) {
pizza = factory.createPizza(type);
break;
}
}
if (pizza == null){
System.out.println("Error: invalid type of pizza");
return null;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
任何額外的 styles 不會影響或導致商店發生變化。 工廠制作披薩的方式的任何變化也不會影響或導致商店發生變化。
因此,商店依賴於抽象而不是具體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.