1. 程式人生 > >設計模式-三種工廠模式-(附Java原始碼)

設計模式-三種工廠模式-(附Java原始碼)

建議結合示例原始碼理解

1 簡單工廠模式

簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式

  • 簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個引數,就可以獲取你所需要的物件,而無須知道其建立細節
  • 主要優點:
    • 客戶端免除直接建立物件,實現物件創建於使用的分離
    • 客戶端無需知道具體產品類的類名,只需要知道對應的引數即可
    • 通過引入配置檔案,可以在不修改客戶端程式碼的情況下更換新的產品類
  • 主要缺點:
    • 由於產品類中集中了所有產品的建立邏輯,職責過重,一旦不能正常工作,整個系統都要收到影響
    • 增加系統中類的個數,增加了系統的複雜度
    • 系統拓展困難,一旦有新產品就不得不修改工廠邏輯,不利於拓展與維護
  • 使用場景:
    • 工廠類負責建立的物件比較少,
    • 客戶端只知道傳入工廠類的引數,對於如何建立物件不關心

2 工廠方法模式

簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,需要在其中加入必要的業務邏輯,這違背了“開閉原則” 。 在工廠方法中,我們不在提供統一的工廠類來建立所有的產品物件,而是針對不同的產品提供不同的工廠,

  • 一個用於建立物件的介面,讓子類決定將哪一個類例項化。工廠方法模式讓一個類的例項化延遲到其子類
  • 工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優點,同時還彌補了簡單工廠模式的不足,工廠方法模式是使用頻率最高的設計模式之一,是很多開源框架與API類庫的核心模式
  • 主要優點:
    • 使用者建立產品,只需要關心產品對應的工廠,無需關心細節,甚至無需知道具體產品類的類名
    • 在加入新產品時,無需修改客戶端,只需要增加一個具體工廠與具體產品就可以,符合開閉原則
  • 主要缺點:
    • 增加新產品時,需要編寫具體的產品類,還需要提供對應的工廠類,增加了系統的複雜度
    • 由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端程式碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度
  • 適用場景:
    • 客戶端不知道它所需要的物件的類 ,只知道對應的工廠名稱
    • 抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的物件,利用面向物件的多型性和里氏代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件

3 抽象工廠模式

工廠方法模式通過引入工廠等級結構,解決了簡單工廠模式中工廠類職責太重的問題,但由於工廠方法模式中的每個工廠只生產一類產品,可能會導致系統中存在大量的工廠類,勢必會增加系統的開銷。此時,我們可以考慮將一些相關的產品組成一個“產品族”,由同一個工廠來統一生產

  • 抽象工廠模式是工廠模式的進一步的延伸,由於它提供了功能更為強大的工廠類,並具備較好的可拓展性,在軟體開發張得以廣泛應用
  • 主要優點:
    • 增加新產品很方便,符合“開閉原則”,
  • 主要缺點:
    • 增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層程式碼,這顯然會帶來較大的不便,違背了“開閉原則
  • 適用場景:
    • 一個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有型別的工廠模式都是很重要的,使用者無須關心物件的建立過程,將物件的建立和使用解耦
    • 系統中有多於一個的產品族,而每次只使用其中某一產品族。可以通過配置檔案等方式來使得使用者可以動態改變產品族,也可以很方便地增加新的產品族
    • 產品等級結構穩定,設計完成之後,不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構。

相關連結: