設計模式之工廠方法模式


  工廠模式屬於創建型設計模式,它提供了一種創建對象的最佳方式。

  定義:定義了一個創建產品對象的工廠接口,將實際創建工作推遲到子類工廠當中。

  問題描述:簡單工廠模式中,只要添加新的產品類,就得去修改工廠類,這樣做勢必違反了開閉原則。

  解決方案:新增抽象工廠類,讓抽象產品對應抽象工廠,讓具體產品對應具體工廠,實際的創建工作推遲到子類工廠中去做。

  結構圖

  

  說明:

  (1)抽象工廠角色:是工廠方法模式的核心,任何在模式中創建對象的工廠類必須實現這個接口。

  (2)具體工廠角色:實現抽象工廠接口的具體工廠類,用於創建具體產品對象。

  (3)抽象產品角色:具體產品對象的共同父類或共同擁有的接口。

  (4)具體產品角色:實現抽象產品接口的具體產品類,包含產品的具體細節。

 

  舉個栗子:依舊是那個我養寵物的故事,故事的情節優化了一下。

  將AnimalFactory改為抽象工廠類,包含一個getAnimal()方法,並新增DogFactory和CatFactory兩個具體工廠類,均實現抽象工廠定義的工廠方法,返回其對應的具體產品類。具體實現方式如下:

  1. 在簡單工廠模式的代碼的基礎上,將類AnimalFactory改為抽象工廠類,並包含一個getAnimal()方法。代碼如下:

      

  2. 新增DogFactory和CatFactory兩個具體工廠類,均實現AnimalFactory接口中的方法,返回相應的具體產品類對象。代碼如下:

         

 

         

  3. 在類FactoryMethodFragment中,具體工廠類對應具體產品類。代碼如下:

         

  4. 運行后的結果,如下所示:

       

 

  綜上所述,核心工廠類不再負責產品的創建工作,讓它成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品,完全遵守了開閉原則,提高了可擴展性。在這個模式中,工廠類和產品類往往一一對應,即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。

 

  優點

  (1)利用工廠的工廠方法類去創建具體的產品對象,隱藏了具體產品對象的創建細節,只需要關心具體產品對應的具體工廠;

  (2)遵守開閉原則。加入新的產品類時,只需要同時加入工廠類就可以實現擴展,無需修改原來的代碼。

  缺點

  隨着產品種類的數量的增長,工廠類也會隨之增加,將不利於系統的維護,增加系統編譯和運行的開銷。

  適用場景

  (1)對於某個產品,調用者清楚地知道應該使用哪個具體的工廠來服務,實例化該具體工廠,生產出具體的產品來;

  (2)只是需要一種產品,而不想知道也不需要知道工廠是如何生產出來的,自需要知道具體對應的工廠就行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM