我读过工厂方法,其中子类创建需要的对象,抽象工厂有具体类创建所需对象的方法
工厂法
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");
}
}使用工厂方法和抽象工厂实现相同的用例。为什么应该使用FactoryMethod而不是使用抽象工厂或实用程序工厂(比如芝加哥工厂/纽约工厂)。在哪种情况下,工厂方法对抽象方法是有用的?
发布于 2013-12-27 12:19:26
您应该询问工厂任务在概念上是否绑定到基类和/或子类(比如createPizza) (比如procurePizzaBoxes)。比萨饼盒供应商不仅在概念上是不同的,而且可以交换。它甚至可能是一家为每个城市提供比萨饼盒的全国性公司。
另一种决定方法是,如果您只是为了实现工厂方法而创建子类,那么最好将它分解成一个抽象工厂。
但是,如果子类有它们自己的特性,并且不管如何都需要存在,并且方法的实现与它们相关联(即使它是procurePizzaBoxes,但供应商是本地的,而不是一个重要的细节),那么您应该使用工厂方法作为多态和面向对象的自然应用程序,并保持类的计数。
从工厂方法重构到抽象工厂可能比相反更容易,并且需要更少的类,因此可以认为是比较保守的选择。
发布于 2013-12-27 11:47:41
主要的区别是,您可以实现一个工厂对象,而不需要对处理工厂的对象进行子类处理。这也意味着你可以马上做一些像交换工厂之类的事情。另一方面,如果您只是做一些简单或紧密耦合的事情,那么您最好提供方法,就像提供更简单的方法一样。
https://stackoverflow.com/questions/20799645
复制相似问题