1. 程式人生 > >工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(二):工廠方法模式概述

工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(二):工廠方法模式概述

2 工廠方法模式概述

       在簡單工廠模式中只提供一個工廠類,該工廠類處於對產品類進行例項化的中心位置,它需要知道每一個產品物件的建立細節,並決定何時例項化哪一個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,需要在其中加入必要的業務邏輯,這違背了“開閉原則”。此外,在簡單工廠模式中,所有的產品都由同一個工廠建立,工廠類職責較重,業務邏輯較為複雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴充套件性,而工廠方法模式則可以很好地解決這一問題。

       在工廠方法模式中,我們不再提供一個統一的工廠類來建立所有的產品物件,而是針對不同的產品提供不同的工廠,系統提供一個與產品等級結構對應的工廠等級結構

。工廠方法模式定義如下:

       工廠方法模式(Factory Method Pattern):定義一個用於建立物件的介面,讓子類決定將哪一個類例項化。工廠方法模式讓一個類的例項化延遲到其子類。工廠方法模式又簡稱為工廠模式(Factory Pattern),又可稱作虛擬構造器模式(Virtual Constructor Pattern)或多型工廠模式(Polymorphic Factory Pattern)。工廠方法模式是一種類建立型模式。

工廠方法模式提供一個抽象工廠介面來宣告抽象工廠方法,而由其子類來具體實現工廠方法,建立具體的產品物件。工廠方法模式結構如圖2所示:

工廠方法模式結構圖

       在工廠方法模式結構圖中包含如下幾個角色:

       ● Product(抽象產品):它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品物件的公共父類。

       ● ConcreteProduct(具體產品):它實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。

       ● Factory(抽象工廠):在抽象工廠類中,聲明瞭工廠方法(Factory Method),用於返回一個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面。

       ● ConcreteFactory

(具體工廠):它是抽象工廠類的子類,實現了抽象工廠中定義的工廠方法,並可由客戶端呼叫,返回一個具體產品類的例項。

與簡單工廠模式相比,工廠方法模式最重要的區別是引入了抽象工廠角色,抽象工廠可以是介面,也可以是抽象類或者具體類,其典型程式碼如下所示:

  1. interface Factory {  
  2.     public Product factoryMethod();  
  3. }  

       在抽象工廠中聲明瞭工廠方法但並未實現工廠方法,具體產品物件的建立由其子類負責,客戶端針對抽象工廠程式設計,可在執行時再指定具體工廠類,具體工廠類實現了工廠方法,不同的具體工廠可以建立不同的具體產品,其典型程式碼如下所示:

  1. class ConcreteFactory implements Factory {  
  2.     public Product factoryMethod() {  
  3.         returnnew ConcreteProduct();  
  4.     }  
  5. }  

       在實際使用時,具體工廠類在實現工廠方法時除了建立具體產品物件之外,還可以負責產品物件的初始化工作以及一些資源和環境配置工作,例如連線資料庫、建立檔案等。

在客戶端程式碼中,只需關心工廠類即可,不同的具體工廠可以建立不同的產品,典型的客戶端類程式碼片段如下所示:

  1. ……  
  2. Factory factory;  
  3. factory = new ConcreteFactory(); //可通過配置檔案實現
  4. Product product;  
  5. product = factory.factoryMethod();  
  6. ……  

       可以通過配置檔案來儲存具體工廠類ConcreteFactory的類名,更換新的具體工廠時無須修改原始碼,系統擴充套件更為方便。

疑問

思考

工廠方法模式中的工廠方法能否為靜態方法?為什麼?