《Head first 设计模式》P135的最后一个问答,简单工厂与工厂方法之间的差异:
/*
*P116,简单工厂
*/
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
pizza = factory.createPizza(type);
//TODO
}
}
//factory.createPizza(type)
if(type.equals("cheese")) {
pizza = new XXXPizza();
} else if(type.equals("yyy")) {
pizza = new YYYPizza();
} else if(type.equals("zzz")) {
pizza = new ZZZPizza();
}
/*
*工厂方法
*/
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
pizza = createPizza(type);
//TODO
}
protected abstract Pizza createPizza(String type);//具体怎么create交给子类实现
}
简单工厂的那些createPizza方法在编写时已经写死,在运行时就是这么些的选择。如果想运行时,在多个方法间切换,就需要运用多态,比如用到工厂的接口、抽象类、父类,public PizzaStore(PizzaFactory factory)
将SimplePizzaFactory抽象成更一般化的PizzaFactory,这样就可以根据传入的参数,确定具体的createPizza的方法了。
按照上述修改和额外的改动(将成员变量PizzaFactory的抽象往上拉到了类PizzaStore抽象),简单工厂就变成了工厂方法。