设计模式 - 抽象工厂模式(abstract factory pattern) 详解(二)

2014-11-23 17:48:57 · 作者: · 浏览: 56
oni createPepperoni() { // TODO Auto-generated method stub return new SlicedPepperoni(); } /* (non-Javadoc) * @see factory.PizzaIngredientFactory#createClam() */ @Override public Clams createClam() { // TODO Auto-generated method stub return new FrozenClams(); } }
3. 产品抽象(abstract)父类, 提供接口, 供 具体产品(concrete product)调用.

代码:

/**
 * @time 2014年5月26日
 */
package factory;

/**
 * @author C.L.Wang
 *
 */
public abstract class Pizza {
	String name;
	Dough dough; //生面团
	Sauce sauce; //调味汁
	Veggies veggies[];
	Cheese cheese;
	Pepperoni pepperoni;
	Clams clam;
	
	abstract void prepare();
	
	void bake() {
		System.out.println("Bake for 25 minutes at 350");
	}
	
	void cut() {
		System.out.println("Cutting the pizza into diagonal slices");
	}
	
	void box() {
		System.out.println("Place pizza in official PizzaStore box");
	}
	
	void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
}

4. 具体产品(concrete product)继承 产品抽象(abstract)父类, 使用 工厂类实现 继承接口, 通过 不同的工厂生产不同的产品;

代码:

/**
 * @time 2014年5月26日
 */
package factory;

/**
 * @author C.L.Wang
 *
 */
public class CheesePizza extends Pizza {

	PizzaIngredientFactory pizzaIngredientFactory;
	
	public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory) {
		this.pizzaIngredientFactory = pizzaIngredientFactory;
	}
	
	/* (non-Javadoc)
	 * @see factory.Pizza#prepare()
	 */
	@Override
	void prepare() {
		// TODO Auto-generated method stub
		System.out.println("Preparing " + name);
		dough = pizzaIngredientFactory.createDough();
		sauce = pizzaIngredientFactory.createSauce();
		cheese = pizzaIngredientFactory.createCheese();
		System.out.println("Ingredient : " + dough + ", " + sauce + ", " + cheese);
	}

}


/**
 * @time 2014年5月26日
 */
package factory;

/**
 * @author C.L.Wang
 *
 */
public class ClamPizza extends Pizza {

	PizzaIngredientFactory pizzaIngredientFactory;
	
	public ClamPizza(PizzaIngredientFactory pizzaIngredientFactory) {
		this.pizzaIngredientFactory = pizzaIngredientFactory;
	}
	
	/* (non-Javadoc)
	 * @see factory.Pizza#prepare()
	 */
	@Override
	void prepare() {
		// TODO Auto-generated method stub
		System.out.println("Preparing " + name);
		dough = pizzaIngredientFactory.createDough();
		sauce = pizzaIngredientFactory.createSauce();
		cheese = pizzaIngredientFactory.createCheese();
		clam = pizzaIngredientFactory.createClam();
		System.out.println("Ingredient : " + dough + ", " 
				+ sauce + ", " + cheese + ", " + clam);
	}

}

5. 具体 调用函数, 通过 传递不同的参数, 调用不同的工厂, 生产出 不同的产品.

代码:

/**
 * @time 2014年5月26日
 */
package factory;

/**
 * @author C.L.Wang
 *
 */
public class NYPizzaStore extends PizzaStore {

	/* (non-Javadoc)
	 * @see factory.PizzaStore#createPizza(java.lang.String)
	 */
	@Override
	Pizza createPizza(String item) {
		// TODO Auto-generated method stub
		Pizza pizza = null;
		PizzaIngredientFactory pizzaIngredientFactory = new NYPizzaIngredientFactory();
		if (item.equals("cheese")) {
			pizza = new CheesePizza(pizzaIngredientFactory);
			pizza.setName("New York Style Cheese Pizza");
		} else if (item.equals("clam")) {
			pizza = new ClamPizza(pizzaIngredientFactory);
			pizza.setName("New York Style Clam Pizza");
		}
		
		return pizza;
	}

}


/**
 * @time 2014年5月26日
 */
package factor