工厂方法模式让类把实例化推迟到子类
假设披萨店要开一个分店,加盟店需要提供不同风味的比萨。
一种做法是写出几种不同的工厂:
factory = new SimplePizzaFactory();
PizzaStore pizzaStore = new PizzaStore(factory);
pizzaStore.orderPizza("cheese");
// 加盟店,纽约风味披萨
factory = new NYPizzaFactory();
pizzaStore = new PizzaStore(factory);
pizzaStore.orderPizza("cheese");
这里每次都new一个PizzaStore,并装配不同的factory。新的加盟店重复着这个流程。
我们看一下另外一种做法:
public class NYPizzaStore extends PizzaStore {
@Override
public Pizza createPizza(String type) {
Pizza pizza = null;
if ("cheese".equals(type)) {
pizza = new NYCheesePizza();
} else if ("veggie".equals(type)) {
pizza = new NYVeggiePizza();
}
return pizza;
}
}
public abstract class PizzaStore {
public abstract Pizza createPizza(String type);
// 预定一个pizza
Pizza orderPizza(String type) {
// new一个pizza
Pizza pizza = createPizza(type);
// 准备食材
pizza.prepare();
// 烘焙
pizza.bake();
// 装盒
pizza.box();
return pizza;
}
}
PizzaStore pizzaStore = new SimplePizzaStore();
pizzaStore.orderPizza("cheese");
// 加盟店,纽约风味披萨
PizzaStore nyPizzaStore = new NYPizzaStore();
nyPizzaStore.orderPizza("cheese");
这种做法,我们不用关心应该组合哪个工厂,且共用了PizzaStore#orderPizza方法(预定流程保持一致),而具体
是哪个加盟店的披萨,延迟到子类(NYPizzaStore)实现createPizza()。