設計模式-工廠方法模式

來源:《設計模式之禪》java

定義:定義一個用於建立對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。web

  1. 抽象產品類Product定義產品共性,實現對事物最抽象的定義。設計模式

  2. Creator定義抽象建立類,即抽象工廠。緩存

  3. ConcreteCreator具體工廠,實現產品類的建立。框架

類圖:ide

代碼:測試

抽象工廠類:spa

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 抽象建立者
 */
public abstract class AbstractCreator {
	
	/**
	 * 定義建立產品方法
	 * @param clazz
	 * @return
	 */
	public abstract <T extends Product> T createProduct(Class<T> clazz);
}


具體工廠類:設計

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 具體工廠建立類
 */
public class Creator extends AbstractCreator {

	/* (non-Javadoc)
	 * @see cc.pattern.factory.AbstractCreater#createProduct(java.lang.Class)
	 */
	@Override
	public <T extends Product> T createProduct(Class<T> clazz) {
		Object product = null;
		try {
			product = Class.forName(clazz.getName()).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return (T)product;
	}

}

抽象產品類:code

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 抽象產品類
 */
public abstract class Product {
	
	/**
	 * 產品公共方法
	 */
	public void commonMethod() {
		System.out.println("###Product.commonMethod...");
		
	}
	
	/**
	 * 產品抽象方法
	 */
	public abstract void action();
}

具體產品類:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 具體產品類
 */
public class ConcreteProduct extends Product {

	/* (non-Javadoc)
	 * @see cc.pattern.factory.Product#action()
	 */
	@Override
	public void action() {
		System.out.println("###ConcreteProduct.action...");
	}

}
/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 具體產品類
 */
public class ConcreteProduct2 extends Product {

	/* (non-Javadoc)
	 * @see cc.pattern.factory.Product#action()
	 */
	@Override
	public void action() {
		System.out.println("###ConcreteProduct2.action...");
	}

}

場景類:

/**
 * 
 */
package cc.pattern.factory;

/**
 * @author rico
 * 場景類
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractCreator creator = new Creator();
		
		Product product1 = creator.createProduct(ConcreteProduct.class);
		product1.action();
		
		Product product2 = creator.createProduct(ConcreteProduct2.class);
		product2.action();
	}

}


工廠方法模式優勢:

  1. 良好的封裝性,代碼結構清晰。

  2. 良好的擴展性。

  3. 屏蔽產品類。產品接口保持不變,上次模塊就不會發生變化。

  4. 典型的解耦框架。

工廠方法模式缺點:

使用場景:

  1. 工廠方法模式是new一個對象的替代品,能夠用於生產須要的對象,可是須要考慮是否要添加一個工廠類,增長代碼的複雜度。

  2. 須要靈活,可擴展的框架時。定義一個工廠方法,根據傳入的條件生存對應的對象。

  3. 工廠方法模式能夠用於異構項目中。

  4. 能夠使用在測試驅動開發框架下。

擴展:

  1. 縮小爲簡單工廠模式,去掉抽象工廠類,並把建立產品的方法定義爲靜態方法。

  2. 升級爲多個工廠類,爲每一個產品定義一個建立者,由調用者決定選擇哪一個產品建立者。

  3. 代替單例模式。

  4. 延遲初始化。工廠負責對象的建立,而且經過Map保存一個緩存。

相關文章
相關標籤/搜索