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