來源:《設計模式之禪》java
定義:定義一個用於建立對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。web
抽象產品類Product定義產品共性,實現對事物最抽象的定義。設計模式
Creator定義抽象建立類,即抽象工廠。緩存
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(); } }
工廠方法模式優勢:
良好的封裝性,代碼結構清晰。
良好的擴展性。
屏蔽產品類。產品接口保持不變,上次模塊就不會發生變化。
典型的解耦框架。
工廠方法模式缺點:
使用場景:
工廠方法模式是new一個對象的替代品,能夠用於生產須要的對象,可是須要考慮是否要添加一個工廠類,增長代碼的複雜度。
須要靈活,可擴展的框架時。定義一個工廠方法,根據傳入的條件生存對應的對象。
工廠方法模式能夠用於異構項目中。
能夠使用在測試驅動開發框架下。
擴展:
縮小爲簡單工廠模式,去掉抽象工廠類,並把建立產品的方法定義爲靜態方法。
升級爲多個工廠類,爲每一個產品定義一個建立者,由調用者決定選擇哪一個產品建立者。
代替單例模式。
延遲初始化。工廠負責對象的建立,而且經過Map保存一個緩存。