工厂> 抽象工厂

来源:互联网 发布:威海高哥淘宝店 编辑:程序博客网 时间:2024/04/28 17:50

通过抽象工厂所提供的接口,可以创建产品家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各式各样的工厂,制造出各种不同的产品。

使用抽象工厂模式时,系统中通常有多个产品族,而系统一次只可能消费其中一族产品。

该模式下的类图:

这里写图片描述

Abstract Factory

如下抽象工厂定义了一个接口,所有的具体工厂都必须实现这个接口,这个接口包含了一组方法用来创建一组相关的产品。

package factory.abstractdemo;public interface PizzaIngredientFactory {    public Dough createDough(); //制作面团    public Sauce createSauce(); //调料    public Cheese createCheese(); //奶油}

其中,面团、调料和奶油是三棵产品树,每棵树中拿出一个产品,组合起来就是一个产品家族,比如下面的(薄皮面团、海员式沙司、巴马干酪)就组成了一个产品家族;而(厚皮面团、番茄沙司、硬质奶酪)又是一个产品家族。生产Pizza时,每次都是消费一个产品家族。其中Dough、Sauce、Cheese都是抽象产品。

Concrete Factory 1

实现PizzaIngredientFactory接口的具体工厂-纽约原料工厂:

package factory.abstractdemo;// 纽约原料工厂public class NYPizzaIngredientFactory implements PizzaIngredientFactory{    @Override    public Dough createDough() {        return new ThinCrustDough(); //薄皮    }    @Override    public Sauce createSauce() {        return new MarinaraSauce(); //海员式沙司    }    @Override    public Cheese createCheese() {        return new ReggianoCheese(); //巴马干酪    }}

每个具体的工厂类产生的Dough+Sauce+Cheese构成了一个产品家族,不同的具体的工厂类产生了不同的产品家族。

Concrete Factory 2

再来看制造另一个产品家族的具体工厂类ChicagoPizzaIngredientFactory:

package factory.abstractdemo;// 芝加哥原料工厂public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{    @Override    public Dough createDough() {        return new ThickCrustDough(); //厚皮    }    @Override    public Sauce createSauce() {        return new TomatoSauce(); //番茄沙司    }    @Override    public Cheese createCheese() {        return new HardCheese(); //硬质奶酪    }}

Client:

public class Pizza{    private Dough dough;    private Sauce sauce;    private Cheese cheese;    private PizzaIngredientFactory factory;    public void setFactory(PizzaIngredientFactory factory) {        this.factory = factory;    }    public void prepare(){        this.dough = this.factory.createDough();        this.sauce = this.factory.createSauce();        this.cheese = this.factory.createCheese();        System.out.println("原料准备完毕");    }}

测试代码:

public class Test {    public static void main(String[] args) {        PizzaIngredientFactory factory = new NYPizzaIngredientFactory();        Pizza p = new Pizza();        p.setFactory(factory);        p.prepare();    }}

输出结果:

原料准备完毕

参考资料:《Head First 设计模式》

0 0