标签:
Head First 设计模式一书中对抽象工厂模式的定义是:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
Pizza(抽象产品接口)
public interface Pizza { public void prepare(); public void bake(); public void cut(); public void box(); }
CheesePizza(实际产品)
public class CheesePizza implements Pizza { @Override public void prepare() { System.out.println("prepare cheese pizza"); } @Override public void bake() { System.out.println("bake cheese pizza"); } @Override public void cut() { System.out.println("cut cheese pizza"); } @Override public void box() { System.out.println("pack cheese pizza"); } }
ClamPizza(实际产品)
public class ClamPizza implements Pizza { @Override public void prepare() { System.out.println("prepare calm pizza"); } @Override public void bake() { System.out.println("bake calm pizza"); } @Override public void cut() { System.out.println("cut calm pizza"); } @Override public void box() { System.out.println("pack calm pizza"); } }
MushroomPizza(实际产品)
public class MushroomPizza implements Pizza { @Override public void prepare() { System.out.println("prepare mushroom pizza"); } @Override public void bake() { System.out.println("bake mushroom pizza"); } @Override public void cut() { System.out.println("cut mushroom pizza"); } @Override public void box() { System.out.println("pack mushroom pizza"); } }
PizzaFactory(抽象工厂接口)
public interface PizzaFactory { public Pizza createPizza(); }
CheesePizzaCreator(对象的实际创建者)
public class CheesePizzaCreator implements PizzaFactory { @Override public Pizza createPizza() { return new CheesePizza(); } }
ClamPizzaCreator(对象的实际创建者)
public class ClamPizzaCreator implements PizzaFactory { @Override public Pizza createPizza() { return new ClamPizza(); } }
MushroomPizzaCreator(对象的实际创建者)
public class MushroomPizzaCreator implements PizzaFactory { @Override public Pizza createPizza() { return new MushroomPizza(); } }
测试类
public class MyTest { @Test public void test() { // PizzaFactory factory = new ClamPizzaCreator(); // PizzaFactory factory = new CheesePizzaCreator(); PizzaFactory factory = new MushroomPizzaCreator(); Pizza pizza = factory.createPizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } }
由实际代码可以看出,抽象工厂模式把对象的创建推迟到了子类之中,这样达到了解耦的目的,在测试类中,客户并不需要知道CheesePizza和MushroomPizza在准备原料,烘焙,包装时的一些差异,客户只需要知道,我需要一个蘑菇风味的披萨,于是我要MushroomPizzaCreator这个子工厂去给我生成一个蘑菇披萨就好了,如果下次我们打算加入一个新的披萨例如HamPizza,原有的代码不需要做任何改变,我们只要添加一个实际的产品,HamPizza和实际的子工厂,HamPizzaCreator就可以了;如果我们不打算销售Clam风味的披萨(味道会不会很怪?),只需要删除ClamPizza产品和其对应的子工厂就好了,客户只要根据菜单来点菜就好了,抽象工厂模式有几个优点符合OO设计原则:
1. 将不变和可变部分分离开来,对可变部分进行封装。
2. 将对象的实例化推迟到子类来达到解耦的目的。
3. 面向接口编程而非面向实现编程
标签:
原文地址:http://www.cnblogs.com/stonefeng/p/5682935.html