工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(二):工廠方法模式概述
2 工廠方法模式概述
在簡單工廠模式中只提供一個工廠類,該工廠類處於對產品類進行例項化的中心位置,它需要知道每一個產品物件的建立細節,並決定何時例項化哪一個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,需要在其中加入必要的業務邏輯,這違背了“開閉原則”。此外,在簡單工廠模式中,所有的產品都由同一個工廠建立,工廠類職責較重,業務邏輯較為複雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴充套件性,而工廠方法模式則可以很好地解決這一問題。
在工廠方法模式中,我們不再提供一個統一的工廠類來建立所有的產品物件,而是針對不同的產品提供不同的工廠,系統提供一個與產品等級結構對應的工廠等級結構
工廠方法模式(Factory Method Pattern):定義一個用於建立物件的介面,讓子類決定將哪一個類例項化。工廠方法模式讓一個類的例項化延遲到其子類。工廠方法模式又簡稱為工廠模式(Factory Pattern),又可稱作虛擬構造器模式(Virtual Constructor Pattern)或多型工廠模式(Polymorphic Factory Pattern)。工廠方法模式是一種類建立型模式。 |
工廠方法模式提供一個抽象工廠介面來宣告抽象工廠方法,而由其子類來具體實現工廠方法,建立具體的產品物件。工廠方法模式結構如圖2所示:
圖2 工廠方法模式結構圖
在工廠方法模式結構圖中包含如下幾個角色:
● Product(抽象產品):它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品物件的公共父類。
● ConcreteProduct(具體產品):它實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。
● Factory(抽象工廠):在抽象工廠類中,聲明瞭工廠方法(Factory Method),用於返回一個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面。
● ConcreteFactory
與簡單工廠模式相比,工廠方法模式最重要的區別是引入了抽象工廠角色,抽象工廠可以是介面,也可以是抽象類或者具體類,其典型程式碼如下所示:
- interface Factory {
- public Product factoryMethod();
- }
在抽象工廠中聲明瞭工廠方法但並未實現工廠方法,具體產品物件的建立由其子類負責,客戶端針對抽象工廠程式設計,可在執行時再指定具體工廠類,具體工廠類實現了工廠方法,不同的具體工廠可以建立不同的具體產品,其典型程式碼如下所示:
- class ConcreteFactory implements Factory {
- public Product factoryMethod() {
- returnnew ConcreteProduct();
- }
- }
在實際使用時,具體工廠類在實現工廠方法時除了建立具體產品物件之外,還可以負責產品物件的初始化工作以及一些資源和環境配置工作,例如連線資料庫、建立檔案等。
在客戶端程式碼中,只需關心工廠類即可,不同的具體工廠可以建立不同的產品,典型的客戶端類程式碼片段如下所示:
- ……
- Factory factory;
- factory = new ConcreteFactory(); //可通過配置檔案實現
- Product product;
- product = factory.factoryMethod();
- ……
可以通過配置檔案來儲存具體工廠類ConcreteFactory的類名,更換新的具體工廠時無須修改原始碼,系統擴充套件更為方便。
|