1.定义
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类.
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道具体产品是什么.
2.代码实现
还是以披萨为例子,这边可以利用抽象工厂生产不同地区的调料,按照抽象工厂的定义,我们需要先定义一个生产面团,沙司,奶酪,蔬菜等材料的接口
public interface PizzaIngredientFactory { public Dough createDough(); public Sauce createSauce(); public Cheese createCheese(); public Veggies[] createVeggies(); public Pepperoni createPepperoni(); public Clams createClam(); }
我们直接定义纽约的材料工厂,这边会生产纽约披萨相关的材料
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(); } @Override public Veggies[] createVeggies() { Veggies veggies[] = {new Garlic(), new Onion(), new Mushroom(), new RedPepper()}; return veggies; } @Override public Pepperoni createPepperoni() { return new SlicedPepperoni(); } @Override public Clams createClam() { return new FreshClam(); } }
直接在CheesePizza中实现相关的材料即可
public class CheesePizza extends Pizza { PizzaIngredientFactory ingredientFactory; public CheesePizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = ingredientFactory; } @Override void prepare() { System.out.println("prepare:"+name); dough = ingredientFactory.createDough(); sauce = ingredientFactory.createSauce(); cheese = ingredientFactory.createCheese(); } }
这边我们可以看到,可以根据传入具体的材料工厂来实现不同的披萨,所以我们可以实现各种pizzy,只需要定义一个CheesePizza类即可,不用像工厂模式一样定义NYCheesePizza,ChicagoCheesePizza,这边整体就看起来简单多了.
直接根据材料工厂来生成pizza即可.
public class NYStylePizzaStore extends PizzaStore { public NYStylePizzaStore() { super(); } @Override Pizza createPizza(String type) { Pizza pizza = null; PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory(); if (type.equals("cheese")) { pizza = new CheesePizza(ingredientFactory); } if (type.equals("clam")) { pizza = new ClamPizza(ingredientFactory); } return pizza; } }
3.总结
和工厂模式不同的是,工厂模式是在类中定义一个抽象方法生成对象,然后子类通过继承父类实现这个抽象方法,但是抽象工厂模式是定义一组接口,生成相关对象的产品家族,用这个产品家族在生成所需要的对象,感觉抽象工厂模式和简单工厂模式有点相似,但是不同的是简单工厂只是具体的类,而抽象工厂模式是接口.