抽象工厂模式

来源:互联网 发布:搬瓦工 不适合 建站 编辑:程序博客网 时间:2024/06/05 07:11

简单工厂将字符串判断交给了工厂

工厂方法模式不同的工厂创建了不同的产品

接着Pizza的例子,假设createPizza()只是得到了Pizza,交给客户之前这个pizza还需要做一些其他的工序,如撒点肉松、包装等(这里将这些操作统一叫做prepare())。而这些prepare在纽约店和在芝加哥店都是不一样的。那怎么办?抽象工厂代码如下:

首先是Pizza超类,可以看到拥有一个保护的 Pizza原料工厂和meat。通过集成,所有类型的Pizza都应该具有这两个属性

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class Pizza {    protected PizzaIngredientFactory ingredientFactory;    protected Meat meat;    public abstract void prepare();    public abstract void eat();}
接着是各类Pizza

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class CheesePizza extends Pizza {    public CheesePizza(PizzaIngredientFactory ingredientFactory1) {        this.ingredientFactory=ingredientFactory1;    }    @Override    public void prepare() {        this.meat=ingredientFactory.createMeat();    }    @Override    public void eat() {        System.out.println("Cheese use"+meat.name());    }}
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class GreekPizza extends Pizza{    public GreekPizza(PizzaIngredientFactory ingredientFactory1) {        this.ingredientFactory=ingredientFactory1;    }    @Override    public void prepare() {        this.meat=ingredientFactory.createMeat();    }    @Override    public void eat() {        System.out.println("Cheese use"+meat.name());    }}

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class HotPizza extends Pizza {    public HotPizza(PizzaIngredientFactory  ingredientFactory1) {        this.ingredientFactory=ingredientFactory1;    }    @Override    public void prepare() {        this.meat=ingredientFactory.createMeat();    }    @Override     public void eat() {        System.out.println("HotPizza use"+meat.name());    }}
对比工厂方法模式,可以看到,这里没有为不同地方的同类型Pizza作区分。每个类型的Pizza的构造需要传递进去一个地方的原料工厂,prepare直接调用这个地域工厂的方法取得原料Meat。下面是Meat超类的定义,它只有一个活的名字的方法name()。

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public abstract class Meat {    abstract String name();}
//芝加哥的肉

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class ChicagoMeat extends Meat {    @Override    String name() {        return "ChicagoMeat";    }}
//纽约的肉

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class NYMeat extends Meat {    @Override    String name() {        return "NYMeat";    }}

然后是原料工厂超类

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public interface PizzaIngredientFactory {    Meat createMeat();}
//芝加哥的原料工厂

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{    @Override    public Meat createMeat() {        return new ChicagoMeat();    }}
//纽约的原料工厂

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class NYPizzaIngredientFactory implements PizzaIngredientFactory {    @Override    public Meat createMeat() {        return new NYMeat();    }}



接着是PizzaStore超类

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

package Factory.AbstractFactory;/** * 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 CheesePizza(new ChicagoPizzaIngredientFactory());        }else if(type.equals("Greek")){            pizza=new GreekPizza(new ChicagoPizzaIngredientFactory());        }else{            pizza=new HotPizza(new ChicagoPizzaIngredientFactory());        }        return pizza;    }}


//纽约PizzaStore

package Factory.AbstractFactory;/** * 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 CheesePizza(new NYPizzaIngredientFactory());        }else if(type.equals("Greek")){            pizza=new GreekPizza(new NYPizzaIngredientFactory());        }else{            pizza=new HotPizza(new NYPizzaIngredientFactory());        }        return pizza;    }}

可以看到抽象工厂在工厂方法的基础上,将区域Pizza的不同也抽象掉了,没有了NYCheesePizza这样的东西,将不同地域Pizza转化成了不同地域的工厂。对于这个不同,由于Store就是按地域区分的,一次store可以明确的指导该新建哪里的原料工厂。这样材料的不同就对客户封闭了。

最后是主程序

package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class AbstractRun {    public static void main(String[] args){        PizzaStore pizzaStore1=new ChicagoPizzaStore();        Pizza pizza1=pizzaStore1.orderPizza("Cheese");        pizza1.eat();        System.out.println("++++++++++++++++++++++++++++++++++++++++");        PizzaStore pizzaStore2=new NYPizzaStore();        Pizza pizza2=pizzaStore2.orderPizza("Cheese");        pizza2.eat();        System.out.println("++++++++++++++++++++++++++++++++++++++++");        PizzaStore pizzaStore3=new ChicagoPizzaStore();        Pizza pizza3=pizzaStore3.orderPizza("Greek");        pizza3.eat();        System.out.println("++++++++++++++++++++++++++++++++++++++++");        PizzaStore pizzaStore4=new ChicagoPizzaStore();        Pizza pizza4=pizzaStore4.orderPizza("Hot");        pizza4.eat();    }}










0 0