抽象工廠

抽象工廠模式 （ Abstract factory pattern ） 是一種軟件開發設計模式 。 抽象工廠模式提供了一種方式 ， 可以將一組具有同一主題的單獨的工廠封裝起來 。 在正常使用中 ， 客戶端程序需要創建抽象工廠的具體實現 ， 然後使用抽象工廠作爲接口來創建這一主題的具體對象 。 客戶端程序不需要知道 （ 或關心 ） 它從這些內部的工廠方法中獲得對象的具體類型 ， 因爲客戶端程序僅使用這些對象的通用接口 。 抽象工廠模式將一組對象的實現細節與他們的一般使用分離開來 。 舉個例子來說 ， 比如一個抽象工廠類叫做DocumentCreator （ 文檔創建器 ） ， 此類提供創建若干種產品的接口 ， 包括createLetter （ 創建信件 ） 和createResume （ 創建簡歷 ） 。 其中 ， createLetter 返回一個Letter （ 信件 ） ， createResume 返回一個Resume （ 簡歷 ） 。 系統中還有一些DocumentCreator的具體實現類 ， 包括FancyDocumentCreator和ModernDocumentCreator 。 這兩個類對DocumentCreator的兩個方法分別有不同的實現 ， 用來創建不同的 “ 信件 ” 和 “ 簡歷 ” （ 用FancyDocumentCreator的實例可以創建FancyLetter和FancyResume ， 用ModernDocumentCreator的實例可以創建ModernLetter和ModernResume ） 。 這些具體的 “ 信件 ” 和 “ 簡歷 ” 類均繼承自抽象類 ， 即Letter和Resume類 。 客戶端需要創建 “ 信件 ” 或 “ 簡歷 ” 時 ， 先要得到一個合適的DocumentCreator實例 ， 然後調用它的方法 。 一個工廠中創建的每個對象都是同一個主題的 （ “ fancy ” 或者 “ modern ” ） 。 客戶端程序只需要知道得到的對象是 “ 信件 ” 或者 “ 簡歷 ” ， 而不需要知道具體的主題 ， 因此客戶端程序從抽象工廠DocumentCreator中得到了Letter或Resume類的引用 ， 而不是具體類的對象引用 。 “ 工廠 ” 是創建產品 （ 對象 ） 的地方 ， 其目的是將產品的創建與產品的使用分離 。 抽象工廠模式的目的 ， 是將若干抽象產品的接口與不同主題產品的具體實現分離開 。 這樣就能在增加新的具體工廠的時候 ， 不用修改引用抽象工廠的客戶端代碼 。 使用抽象工廠模式 ， 能夠在具體工廠變化的時候 ， 不用修改使用工廠的客戶端代碼 ， 甚至是在運行時 。 然而 ， 使用這種模式或者相似的設計模式 ， 可能給編寫代碼帶來不必要的複雜性和額外的工作 。 正確使用設計模式能夠抵消這樣的 “ 額外工作 ” 。