下面的代碼:在下面的代碼中使用工廠類有什麼好處?
SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
爲什麼要使用,如果你可以使用一些更直觀,如:
SAXParser mySAXParser = new SAXParser();
下面的代碼:在下面的代碼中使用工廠類有什麼好處?
SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
爲什麼要使用,如果你可以使用一些更直觀,如:
SAXParser mySAXParser = new SAXParser();
因爲這允許的框架內,爲您提供透明的方式SAXParser
不同的實現。所使用的實現可以取決於配置參數,框架版本等。使用工廠允許框架開發者例如在不破壞任何客戶端代碼的情況下用不同的更好的解析器實現替換舊的低效率解析器實現。
注意SAXParser
是一個抽象類,所以你不能甚至直接實例化。
SAXParser的是一個抽象類,你不能直接實例化類。
工廠的目的是從有明確瞭解哪些執行的SAXParser的是在使用分離調用者。它還允許工廠在需要時配置解析器,然後將其交給調用者。
它可以讓你確定實際的類,你將使用在不同的地方比的代碼,特別是行分析器的對象。構造者必須明確地說出他們構建的是哪種類型;工廠方法可以隱藏接口後面的決定。
您是否需要這種靈活性取決於您的應用。許多人建議在每種設計中增加這種靈活性以防萬一。其他人則認爲這種態度過於專注。你是法官...
「如果可以的話還有一個問題,爲什麼是通過靜態
newInstance()
方法,而不是通過構造函數實例化的mySAXParserFactory?」
爲了避免您的代碼在特定的SAXParserFactory
類中具有編譯時間依賴性。如果您查看newInstance()
方法的javadoc,您會發現它允許您通過系統屬性,屬性文件或Services API配置不同的解析器工廠類。
「這是一個Singleton?」
號的Javadoc說:「這種靜態方法創建一個新工廠實例」。 。通過靜態方法(如這裏所提到的.newInstance()方法) - (我的重點)
「好吧,我會問一個更普遍的問題,爲什麼一些Java類通過構造函數和其他實例? 「
不同類別有不同的使用情況。例如,您不希望或不需要實現您的應用程序,以便有人可以選擇使用哈希映射或某種數據結構的樹形圖。但是,您可能希望有人能夠選擇不同的XML解析器。
「工廠對象」和「工廠方法」模式的目的是爲了避免在創建對象時對特定對象類的依賴性很大。有時這是一件好事,但在其他情況下,工廠只是「體重不足」。你需要通過經驗學習......何時使用工廠,何時不使用工廠。
好吧,我會問一個更一般的問題。爲什麼Java中的某些類通過構造函數和其他類實例化 - 通過靜態方法(如這裏提到的.newInstance()方法)? – 2010-06-11 09:41:23
如果SAXParser是抽象類 工廠類如何能夠 實例化它?
嗨Emanuil。這是重點:工廠不會實例化SAXParser,而是它的某個子類。正如其他人已經提到的那樣,其中的哪個子類是由配置/框架決定的。
爲什麼mySAXParserFactory通過靜態.newInstance()方法而不是通過其構造函數實例化?
因爲SAXParserFactory本身又是(恕我直通)抽象。 newInstance()方法根據SAXParserFactory的具體子類創建工廠對象。實際上,創建一個具體的工廠就是決定選擇哪種實施方式。
這就是所謂的「抽象工廠模式」,另見:
輝煌!謝謝你的偉大答案! – 2010-06-11 09:48:12
如果SAXParser的是一個抽象類是如何被工廠類能夠實例呢? – 2010-06-11 09:24:36
還有一個問題,如果我可以。爲什麼mySAXParserFactory通過靜態.newInstance()方法實例化,而不是通過其構造函數實例化?這是一個單身? – 2010-06-11 09:27:51
嗨Emanuil,在一個新的答案中看到我對這些意見的回覆 – chiccodoro 2010-06-11 09:48:11