抽象工厂模式
Posted lishuaiqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象工厂模式相关的知识,希望对你有一定的参考价值。
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.总结
和工厂模式不同的是,工厂模式是在类中定义一个抽象方法生成对象,然后子类通过继承父类实现这个抽象方法,但是抽象工厂模式是定义一组接口,生成相关对象的产品家族,用这个产品家族在生成所需要的对象,感觉抽象工厂模式和简单工厂模式有点相似,但是不同的是简单工厂只是具体的类,而抽象工厂模式是接口.
以上是关于抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章