我已经阅读了Factory Method,其中Sub类创建了所需的Object,而Abstract Factory有方法,其中具体类创建了所需的Object
工厂方法
public class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
}
abstract Pizza createPizza(String type);
}
public NewYorkPizzaStore extends PizzaStore {
public Pizza createPizza(String type) {
Pizza pizza = null;
if("cheese".equals(type)) {
pizza = new CheesePizza();
}
else if("onion".equals(type)) {
pizza = new OnionPizza();
}
return pizza;
}
}
public class pizzaTestDriveByFactoryMethod() {
public static void main(String args[]) {
PizzaStore ps = new NewYorkPizzaStore();
ps.orderPizza("cheese");
}
}
使用工厂
public class NewYorkPizzaFactory extends PizzaFactory {
public Pizza createPizza(String pizza) {
Pizza pizza = null;
if("cheese".equals(type)) {
pizza = new CheesePizza();
} else if("onion".equals(type)) {
pizza = new OnionPizza();
}
return pizza;
}
}
public class PizzaStore {
PizzaFactory factory;
public PizzaStore(PizzaFactory factory) {
this.factory = factory
}
public Pizza orderPizza(String type) {
Pizza pizza = factory.createPizza(type)
pizza.prepare();
pizza.bake();
pizza.cut();
return pizza;
}
}
public class pizzaTestDriveByAbstractFactory() {
public static void main(String args[]) {
PizzaFactory nwFactory = new NewYorkPizzaFactory();
PizzaStore ps = new PizzaStore(nwFactory);
ps.orderPizza("cheese");
}
}
使用Factory Method和Abstract Factory实现的相同用例。为什么应该有FactoryMethod而不是使用Abstract Factory或Utility Factory(例如Chicago Factory / NewYorkFactory)。在哪种情况下,Factory方法对抽象方法很有用?
答案 0 :(得分:1)
主要区别在于您可以实现工厂对象,而无需对正在处理工厂的对象进行子类化。这也意味着你可以做一些事情,比如在飞行中交换工厂。另一方面,如果你只是做一些简单或紧密耦合的事情,那么你也可以提供更简单的方法。
答案 1 :(得分:0)
您应该询问工厂任务是否在概念上与基类和/或子类(如createPizza)相关联(如procurePizzaBoxes)。披萨盒供应商不仅在概念上与众不同,而且可以互换。它甚至可能是一家向每个城市提供披萨盒的国家公司。
另一种做出决定的方法是,如果您只是为了实现工厂方法而创建子类,那么最好将其分解为抽象工厂。
但是如果子类有自己的特性并且需要存在,并且该方法的实现与它们相关(即使它是procurePizzaBoxes,但供应商是本地的并且不是一个重要的细节),那么你应该使用工厂方法作为多态和OO的自然应用,并保持类计数。
从工厂方法到抽象工厂的重构可能比反向更容易,并且需要更少的类,因此可以被认为是更保守的选择。