设计模式 - 工厂模式(factory pattern) 详解(一)

2014-11-23 17:48:47 · 作者: · 浏览: 33

工厂模式(factory pattern) 详解

工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类.

包括:

创建者父类(creator), 包含创建对象的方法(代替new具体的对象, 通过参数创建不同的对象), 和一些基本的方法;

具体创建者(concrete creator), 继承创建者父类, 实现创建对象的方法, 不同参数可以创建不同的对象;

产品类父类(product), 包含产品的基本使用方法, 被创建者父类(creator)的基本方法使用;

具体产品(concrete creator), 继承产品类父类, 对特定的产品进行定制, 供具体创建者(concrete creator)选择创建;

具体方法:

1. 产品类父类(product), 包含产品的一些基本方法.

代码:

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

import java.util.ArrayList;

/**
 * @author C.L.Wang
 *
 */
public abstract class Pizza {
	String name;
	String dough; //生面团
	String sauce; //调味汁
	
	ArrayList
  
    toppings = new ArrayList
   
    (); //装饰 void prepare() { System.out.println(Preparing + name); System.out.println(Tossing dough... + dough); System.out.println(Adding sauce... + sauce); System.out.println(Adding toppings: ); for (int i=0; i
    
      2. 
     具体产品类(concrete product), 具体产品的定制方法.
     

代码:

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

/**
 * @author C.L.Wang
 *
 */
public class NYStyleCheesePizza extends Pizza {
	public NYStyleCheesePizza() {
		name = NY Style Sauce and Cheese Pizza;
		dough = Thin Crust Dough;
		sauce = Marinara Sauce;
		
		toppings.add(Grated Reggiano Cheese);
	}
}


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

/**
 * @author C.L.Wang
 *
 */
public class ChicagoStyleCheesePizza extends Pizza {
	public ChicagoStyleCheesePizza() {
		name = Chicago Style Deep Dish Cheese Pizza;
		dough = Extra Thick Crust Dough;
		sauce = Plum Tomato Sauce;
		
		toppings.add(Shredded Mozzarella Cheese);
	}
	
	void cut() {
		System.out.println(Cutting the pizza into square slices);
	}
}

3. 创建者父类(creator), 具体的使用方法, 调用产品类父类(product)的方法, 提供根据参数创建不同具体产品类(concrete product).

代码:

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

/**
 * @author C.L.Wang
 *
 */
public abstract class PizzaStore {
	public Pizza orderPizza(String item) {
		Pizza pizza;
		pizza = createPizza(item);
		
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		
		return pizza;
	}
	
	abstract Pizza createPizza(String item);
}

4. 具体创建者(concrete creator), 通过参数创建不同的具体产品(concrete product).

代码:

/**
 * @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
		
		if (item.equals(cheese)) {
			return new NYStyleCheesePizza();
		} else return null;
	}

}


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

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

	/* (non-Javadoc)
	 * @see factory.PizzaStore#createPizza(java.lang.String)
	 */
	@Override
	Pizza createPizza(String item) {
		// TODO Auto-generated method stub
		
		if (item.equals(cheese)) {
			return new ChicagoStyleCheesePizza();
		} else return null;
	}

}

5. 测试, 创建不同的具体创建者(concrete creator), 即工厂, 通过调用函数的参数, 选择不同的产品进行使用.

代码:

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

/**
 * @author C.L.Wang
 *
 */
public class PizzaTestDrive {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PizzaStore nyStore = new NYPizzaStore();
		PizzaStore chicagoStore = new ChicagoPizzaStore();
		
		Pizza pizza = nyStore.orderPiz