我正在尝试从Head First Design patterns book学习Factory模式。该书说工厂模式有两种类型-工厂方法和抽象工厂。
为什么模式中的代码实现方式不同? 我不是要问模式之间的区别,因为已经回答了。请进一步阅读。
这本书使用Pizza and PizzaStore示例来说明这种模式。我们有一个PizzaStore依赖于Pizza对象。我们必须开发一种通用的PizzaStore软件,该软件可以使人们订购比萨饼。披萨订购的逻辑过程或步骤保持不变-create(String pizzaType),prepare()或setupIngredients(),cut(),box()等。create()方法属于PizzaStore,其他方法属于Pizza 。
在进行该项目时,我们必须经常添加新型的披萨。但是,我们不想每次添加新的Pizza时都不断更改通用的PizzaStore代码。毕竟,比萨的制作和订购过程始终具有相同的逻辑步骤。
对于两种类型的工厂,本书都有单独的代码。例如,下面的Pizza类在工厂方法中仅具有名称,面团,调味料等的String成员。但是在抽象工厂中,它具有面团,调味料等的类。
为什么Pizza在两种模式中不能具有相同类型的成员?在工厂方法中,我们只能使用一种Dough实例而不是String生面团。在抽象工厂中,我们可以有任意数量的Dough实例。我不明白这种不一致的原因。示例是否需要这种不一致?
工厂方法-披萨:
public abstract class Pizza {
String name;
String dough;
String sauce;
ArrayList<String> toppings = new ArrayList<String>();
public void prepare() {
System.out.println("Prepare " + name);
System.out.println("Tossing dough...");
System.out.println("Adding sauce...");
System.out.println("Adding toppings: ");
for (String topping : toppings) {
System.out.println(" " + topping);
}
}
public void bake() {System.out.println("Bake for 25 minutes at 350");}
public void cut() {System.out.println("Cut the pizza into diagonal slices");}
public void box() {System.out.println("Place pizza in official PizzaStore box");}
}
抽象工厂-披萨:
public abstract class Pizza {
String name;
Dough dough;
Sauce sauce;
Veggies veggies[];
Cheese cheese;
Pepperoni pepperoni;
Clams clam;
public abstract void prepare();//Prepares the Dough, Sauce, Cheese etc.
public void bake() {System.out.println("Bake for 25 minutes at 350");}
public void cut() {System.out.println("Cutting the pizza into diagonal slices");}
public void box() {System.out.println("Place pizza in official PizzaStore box");}
}
图:
工厂方法类图:
抽象工厂类图: