定义:一个创建对象的接口, 但由于子类决定要实例化的类是哪一个。 工厂方法让类把实例化推迟到子类;
形象比喻:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
本文采用pizza store来说明。 pizzaStore有几种pizza, 比如cheese、Veggie等风味; 不同地方都可以加盟该pizzaStore, 不同地方也对应不同口味。 如纽约风味和芝加哥风味。 我们可以让pizza制作活动局限于pizzaStore, 而同时又能让这些加盟店依然可以自由的制作该区域的风味。
下面是具体代码。 看代码更好理解一下。
1、pizza与pizzaStore抽象类
pizza.java
public abstract class Pizza {
protected String name;
protected String dough;
protected String sauce;
protected ArrayList<String> toppings = new ArrayList<String>();
public void Prepare() {
System.out.println("Preparing " + name);
System.out.println("Tossing dough... ");
System.out.println("Adding sauce... ");
System.out.println("Adding toppings: ");
for (int i = 0; i < toppings.size(); i++) {
System.out.println(" " + toppings.get(i));
}
}
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 ");
}
public String getName() {
return name;
}
}
pizzaStore.java
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.Prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
2、纽约加盟店, 与纽约风味pizza
NYPizzaStore.java
public class NYPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new NYStyleCheesePizza();
}else if (type.equals("veggie")) {
return new NYStyleVeggiePizza();
}else if (type.equals("clam")) {
return new NYStyleClamPizza();
} else return null;
}
}
纽约cheesepizzaNYStyleCheesePizza.java
public class NYStyleCheesePizza extends Pizza {
public NYStyleCheesePizza() {
name = "[NYStyleCheesePizza]NY Style Sauce and Cheese Pizza";
dough = "[NYStyleCheesePizza]Thin Crust Dough";
sauce = "[NYStyleCheesePizza]Marinara Sauce";
toppings.add("[NYStyleCheesePizza]Grated Reggiano Cheese");
}
}
纽约其他风味pizza这里代码省略 ,与上面类似:NYStyleClamPizza, NYStyleVeggiePizza;3、芝加哥加盟店,与芝加哥风味pizza
ChicagoPizzaStore.java
public class ChicagoPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new ChicagoStyleCheesePizza();
}else if (type.equals("veggie")) {
return new ChicagoStyleVeggiePizza();
}else if (type.equals("clam")) {
return new ChicagoStyleClamPizza();
} else return null;
}
}
芝加哥cheesePizza
public class ChicagoStyleCheesePizza extends Pizza {
public ChicagoStyleCheesePizza() {
name = "[ChicagoStyleCheesePizza]NY Style Deep Dish Cheese Pizza";
dough = "[ChicagoStyleCheesePizza]Extra Thick Crust Dough";
sauce = "[ChicagoStyleCheesePizza]Plum Tomato Sauce";
toppings.add("[ChicagoStyleCheesePizza]Shredded Mozzarella Cheese");
}
public void cut() {
System.out.println("[ChicagoStyleCheesePizza]Cutting the pizza into square slices");
}
}
芝加哥其他风味pizza这里代码省略 ,与上面类似:ChicagoStyleClamPizza, ChicagoStyleVeggiePizza;
public class PizzaMain {
public static void main(String[] args) {
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chicagoStore = new ChicagoPizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a" + pizza.getName() + "\n");
Pizza pizza2 = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a" + pizza2.getName() + "\n");
Pizza pizza3 = chicagoStore.orderPizza("veggie");
System.out.println("Lucy ordered a" + pizza3.getName() + "\n");
}
}
参照《Head First设计模式》