一、
1、介紹:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。簡單工廠模式的最大優點在于工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對于客戶端來說,去除了與具體產品的依賴。工廠方法模式也即將簡單工廠模塊的Factory工廠類拆成接口,再定義具體的工廠子類去實現。
2、結構圖
?3、代碼
/*** 虛擬工廠類* 給具體的工廠類提供虛擬方法*/
abstract class AbstractFactory {// 表示創建產品的方法,此處使用的是通過具體的產品類的Class來確定需要創建的產品// 也可以通過String等其他方式來指定public abstract <T extends AbstractProduct> T create(Class<T> tClass);}
/*** 具體工廠類* 繼承虛擬工廠類,提供真正的創建對象的方法的實現*/
class CommonFactory extends AbstractFactory{@Override // 對虛擬工廠類的方法進行重寫public <T extends AbstractProduct> T create(Class<T> tClass) {T product = null; // 創建一個null對象作為初始化,使catch到異常后也能有null返回作為結果try {// 明明這樣就可以實現,但是書里寫的更加復雜// (T)Class.forName(tClass.getName()).newInstance()// 暫時對此感到不解product = tClass.newInstance(); // 通過反射創建新的對象} catch (Exception e) {e.printStackTrace();}return product;}
}
/*** 虛擬產品類* 對產品類的屬性以及方法做好規范* 如果有所有具體產品類都通用的方法也可以直接實現*/
abstract class AbstractProduct {/*** 通用方法*/public void method1() {System.out.println("所有產品都會這么做");}/*** 每個產品實現各異的方法*/public abstract void method2();
}
/*** 具體產品類* 繼承虛擬產品類,在虛擬產品類提供的默認方法外,具體實現虛擬類中規定的虛擬方法*/
class Product extends AbstractProduct {@Overridepublic void method2() {System.out.println("這是一個具體的產品類的特性");}
}
class Client {public static void main(String[] args) {AbstractFactory factory = new CommonFactory();AbstractProduct product = factory.create(Product.class);product.method1();product.method2();}
}