设计模式——工厂模式

《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抽象),简单工厂就变成了工厂方法。

posted @ 2017-04-08 23:12  水煮海鲜  阅读(99)  评论(0编辑  收藏  举报