2012-08-13 159 views
1

我正經歷着低於抽象工廠設計模式是針對UML圖.. enter image description here關於抽象工廠模式的undrestanding

請建議我要這個paatern最好的例子,因爲我已經試過最好的,但我在搜索那個容易學習的例子,並且想要讓我對抽象工廠模式的理解100%清楚。請告知

回答

5

您是否查看過構建到JDK中的DocumentBuilderFactory類?它完全是這樣做的,它的目標項是一個Document對象。

jdk具有DocumentBuilderFactory類,它使用服務定位器策略來查找DocumentBuilderFactory類(即xerces或其他解析器)的具體實現。

// Uses service locator approach to find an implementor like xerces 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document document = builder.parse(...); 

java.awt.Toolkit是另一個很好的例子。這一次,它使用JVM實現本身提供的實例:

Toolkit toolkit = Toolkit.getDefaultToolkit(); 

實際的具體類不同的是根據你在什麼操作系統,而你在無頭模式或不是否正在運行。

1

回想一下,工廠模式用於創建對象而不指定對象的確切類別,從而減少這兩個組件之間的耦合。抽象工廠模式甚至通過定義所有工廠必須實現的接口來減少解耦的數量。因此,抽象工廠的調用者並不知道工廠的實現以及對象的創建方式。調用者只是發現,在工廠調用方法將產生接口X的某個對象實例。

來自Matt的XML庫示例實際上是一個很好的示例。抽象工廠是創建XML解析器的實體,它創建表示您解析的實際文檔的Document對象。實際上,對於你作爲一個調用者來說,只要你得到一個Document對象,大多數情況下Parser都是完全不相關的。因此您可以簡單地使用抽象工廠。這爲您創建了一個有效的解析器(大部分時間;))

Toolkit示例(也是Matt提到的)是一個更像教科書的例子。想象一下,你只是想在用戶屏幕上填充一個窗口。正如你想以獨立於平臺的方式來做的那樣,你需要定義一個抽象類Window,你可以使用它來完成某些操作。然後你創建一個創建這些窗口的對象,比如說Win32WindowsFactory。但是,由於您的代碼必須是平臺獨立的,因此您需要定義一個接口WindowsFactory,該接口爲您提供了一種方法createWindow()。當使用Win32WindowsFactory時,將返回Win32Window,如果使用LinuxGTKWindowsFactory,則返回GTKWindow

+1

這裏有些困惑。我會說DocumentBuilderFactory實際上是抽象工廠,DocumentBuilder是該工廠的抽象產品。 – lost 2012-08-13 17:32:14

+0

你說得對,我編輯它來反映它。 – Stephan 2012-08-13 17:36:25