摘要:如下工廠類文件我們可以發(fā)現(xiàn),通過工廠類的包裝,在調(diào)用工廠類方法構(gòu)造對象時可以十分輕松地完成任務,而后面的其他任務則交由工廠類的靜態(tài)代碼塊完成。因此我們考慮把這部分代碼寫入工廠類,再生產(chǎn)過程前進行判斷,過程封裝進工廠類。
需要構(gòu)造一個類的對象,我們通常會用new的方法來構(gòu)造:
A a = new A();
但是如果隨著這個對象被創(chuàng)建的同時還必須進行其他相對復雜的操作,那么在新建構(gòu)造一個對象代碼就顯得非常復雜,這個復雜的代碼通常還需要每一次都復寫,大大增加了冗余。
因此我們構(gòu)造了生產(chǎn)這個類對應對象的工廠,用工廠的方法來生產(chǎn)對象。
比如:我們需要在構(gòu)造一個對象時并不知道這個對象中的某個字段的確切值,該值保存在配置文件中,所以每次構(gòu)造對象都要進行配置文件的讀取,依據(jù)配置文件中的內(nèi)容來確定這個對象中該字段的信息,這個過程如果直接使用new來實現(xiàn)將會造成大量代碼的冗余,大量冗余存在于配置文件的加載和讀取,不妨把它封裝成工廠類,在工廠類內(nèi)部實現(xiàn)配置文件的加載和讀取。
有如下配置文件:/src/config.properties:
ImportantString = OK
有如下預創(chuàng)建的對象所屬類:/src/A.java:
public class A { private String Aname; public void Ashout(){ System.out.println("I am "+Aname+",hahaha !"); } public String getAname() { return Aname; } public void setAname(String aname) { Aname = aname; } }
有如下測試文件:/src/Test.java:
public class Test{ public static void main(String[] args) { A a = AFactory.getA(); a.Ashout(); } }
則可以構(gòu)造工廠類來生產(chǎn)該類的對象,生產(chǎn)過程中加載讀取配置文件并將配置文件中的重要字段賦值給創(chuàng)建出的對象,并返回這個創(chuàng)建出的對象。
如下工廠類文件:/src/AFactory.java:
public class AFactory { private static Properties properties = null; private static String ANameToGet; private AFactory() { } static{ try { properties = new Properties(); properties.load(new FileReader(AFactory.class.getClassLoader().getResource("config.properties").getPath())); ANameToGet = properties.getProperty("ImportantString"); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public static A getA(){ A a = new A(); a.setAname(ANameToGet); return a; } }
我們可以發(fā)現(xiàn),通過工廠類的包裝,在調(diào)用工廠類方法構(gòu)造對象時可以十分輕松地完成任務,而后面的其他任務則交由工廠類的靜態(tài)代碼塊完成。
那么什么是萬能工廠類呢?萬能當然不是指能完成一切的工廠,而是說在很多情況下,我們可能需要構(gòu)造各種類的對象,而這些對象在構(gòu)造過程中可能也會完成很多跟構(gòu)造相分離的相對復雜的任務,這些任務可能會導致前臺代碼冗余,而恰恰我們要構(gòu)造的這些對象雖然分屬不同的類卻有結(jié)構(gòu)相同的代碼,這是我們不妨使用泛型來進一步解決這個問題。
以上面的例子為基礎(chǔ),我們需要兩個類,在這兩個類的對象的創(chuàng)建過程中都必須要檢查配置文件中的一對Key是否相等,相等的Key才能允許對象的創(chuàng)建,
否則不允許創(chuàng)建,這個過程中如果在new之前直接做判斷邏輯,將會導致大量的代碼冗余,因為每個類的對象創(chuàng)建前都要進行相同的判斷。因此我們考慮
把這部分代碼寫入工廠類,再生產(chǎn)過程前進行判斷,過程封裝進工廠類。
但是由于我們兩個類的對象的生成實現(xiàn)過程類似,因此不需要分別寫工廠,而是統(tǒng)一地寫一個泛型化的工廠,依據(jù)傳進的類的類型利用Class.forName(className).newInstance()來創(chuàng)建新的對象。
有如下配置文件:/src/config.properties:
Key1 = RightKey Key2 = RightKey
有如下預創(chuàng)建的對象所屬類:/src/A.java:
public class A { }
/src/B.java:
public class B { }
有如下測試文件:/src/Test.java:
public class Test{ public static void main(String[] args) { A a = CommonFactory.getInstance(); B b = CommonFactory.getInstance(); } }
則可以構(gòu)造工廠類來生產(chǎn)該類的對象,生產(chǎn)過程中加載讀取配置文件并將判斷配置文件中的Key以確定對象是否能正常生成,如果可以返回這個創(chuàng)建出的對象。
如下工廠類文件:/src/CommonFactory.java:
public class CommonFactory { private static Properties properties = null; private static String Key1; private static String Key2; static boolean no; private CommonFactory() { } static{ try { properties = new Properties(); properties.load(new FileReader(CommonFactory.class.getClassLoader().getResource("config.properties").getPath())); Key1 = properties.getProperty("Key1"); Key2 = properties.getProperty("Key2"); no = Key1.equals(Key2); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public staticT getInstance(Class clazz){ try { String className = clazz.getName(); if(no){ T t = (T) Class.forName(className).newInstance(); System.out.println(className+" Object Astablished Successfully"); return t; } else { System.out.println(className+" Object Astablished failed"); return null; } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/64321.html
摘要:我們今天也來做一個萬能遙控器設(shè)計模式適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設(shè)計模式的一種建造者模式。設(shè)計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...
摘要:我們今天也來做一個萬能遙控器設(shè)計模式適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設(shè)計模式的一種建造者模式。設(shè)計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...
摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因為所有的具體工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡單工廠模式的進一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態(tài)工廠方法...
摘要:反射提供給面向?qū)ο缶幊炭梢宰允〉哪芰Γ捶瓷?。在簡單工廠模式中,根據(jù)傳遞的參數(shù)來返回不同的類的實例簡單工廠模式又稱為靜態(tài)工廠方法模式。也就是簡單工廠模式工廠工廠類。PHP高級特性-反射以及工廠設(shè)計模式的結(jié)合使用 [結(jié)合 Laravel-Admin 代碼實例講解]利用反射來實現(xiàn)工廠模式的生產(chǎn)而無需創(chuàng)建特定的工廠類本文地址http://janrs.com/?p=833轉(zhuǎn)載無需經(jīng)過作者本人授權(quán)轉(zhuǎn)載...
摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調(diào)用它來實現(xiàn)其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。 一、概念 1、工廠模式分為三類:(1)簡單工廠模式:一個工廠創(chuàng)建所有產(chǎn)品(2)工廠方法模式:一個工廠方法創(chuàng)建一個產(chǎn)品(3)抽象工廠模式:一個工廠方法創(chuàng)建一類產(chǎn)品 2、創(chuàng)建型模式這種模式是指將實例的創(chuàng)建和使用分離開來,隱藏類實例的創(chuàng)建細節(jié),外界...
閱讀 2664·2021-11-22 15:25
閱讀 1525·2021-11-15 17:59
閱讀 1219·2021-09-29 09:34
閱讀 1671·2021-09-26 09:46
閱讀 3117·2021-09-02 15:40
閱讀 1272·2019-08-30 15:56
閱讀 3365·2019-08-30 15:55
閱讀 754·2019-08-29 17:08