工厂方法模式

来源:互联网 发布:英国劳氏海事数据库 编辑:程序博客网 时间:2024/06/04 19:08

核心:只持有抽象的接口引用,由子类去决定实例的创建,将实例化推到子类中去。

同样采用Pizza的例子,当纽约(NY)和芝加哥(Chicago)都开了pizza店,且者两个地方的同类型Pizza味道不同。可以构建如下类:


可以看到createPizza在父类中申明为抽象的,用户首先得创建一个店,NYPizzaStore store,当用户调用AbstractPizzaStore.orderPizza()时,orderPizza()转而调用AbstractPizzaStore.createPizza方法,由于这个方法是抽象的,所以调用的是子类的NYPizzaStore.createPizza(),这个方法根据字符串type返回不同的Pizza。代码如下:

首先是Pizza超类

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class Pizza {    abstract void eat();}

接着ChicagoPizza群

//ChicagoCheesePizza

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoCheesePizza extends Pizza{    @Override      void eat() {        System.out.println("ChicagoCheesePizza");    }}
//ChicagoGreekPizza
package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoGreekPizza extends Pizza{    @Override    void eat() {        System.out.println("ChicagoGreekPizza");    }}
//ChicagoHotPizza

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoHotPizza extends Pizza{    @Override    void eat() {        System.out.println("ChicagoHotPizza");    }}


NYPizza群

//NYCheesePizza

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYCheesePizza extends Pizza {    @Override    void eat() {        System.out.println("NYCheesePizza");    }}

//NYGreekPizza

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYGreekPizza extends Pizza{    @Override    void eat() {        System.out.println("NYGreekPizza");    }}
//NYHotPizza

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYHotPizza extends Pizza{    @Override    void eat() {        System.out.println("NYHotPizza");    }}


然后是store(工厂)超类

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class PizzaStore {    public Pizza orderPizza(String type){        Pizza pizza=createPizza(type);        return pizza;    }    protected abstract Pizza createPizza(String type);}

//ChicagoPizzaStore

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoPizzaStore extends PizzaStore {    @Override    public Pizza createPizza(String type) {        Pizza pizza=null;        if(type.equals("Cheese")){            pizza=new ChicagoCheesePizza();        }else if(type.equals("Greek")){            pizza=new ChicagoGreekPizza();        }else{            pizza=new ChicagoHotPizza();        }        return pizza;    }}
//NYPizzaStore

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class NYPizzaStore extends PizzaStore {    @Override    public Pizza createPizza(String type) {        Pizza pizza=null;        if(type.equals("Cheese")){            pizza=new NYCheesePizza();        }else if(type.equals("Greek")){            pizza=new NYGreekPizza();        }else{            pizza=new NYHotPizza();        }        return pizza;    }}

大功告成,接下来就是测试了

package Factory.MethodFactory;/** * Created by sgzhang on 2015/8/12. */public class FactoryRun {    public static void main(String[] args){        PizzaStore pizzaStore=new ChicagoPizzaStore();        Pizza pizza=pizzaStore.orderPizza("Cheese");        pizza.eat();    }}

可以看到打印出来了

ChicagoCheesePizza










0 0