1. 程式人生 > >【重溫設計模式】之003工廠方法模式

【重溫設計模式】之003工廠方法模式

[【重溫設計模式系列原始碼】](https://github.com/ithinksky/java-patterns) > 工廠方法模式 # 基本原理 ## 含義 > 工廠方法模式又稱為工廠模式、多型工廠模式和虛擬構造器模式。 > 通過定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。 ## 解決的問題 > 即簡單工廠模式的缺點 工廠一旦需要生產新產品就需要修改工廠類的方法邏輯,違背了“開放 - 關閉原則 言外意: > 工廠標準有了,產品標準有了,要想生產新的商品,需要開闢新的工廠生產新的商品。 > 雖然解決了簡單工廠模式的“開閉原則”問題,但同時增加了額外開銷。 > 簡單工廠模式 是一個單一的工廠,如果需要提供新的產品,需要將工廠進行改造, > 可以認為需要擴充套件一條流水線. 資源利用率的把控 凡事皆有度。 ## 組成部分 | 組成 | 關係 | 作用 | | ---- | ---- | ---- | | 產品標準 | 具體產品的父類 | 描述產品的公共介面 | | 具體產品 | 產品標準的具體實現類 | 描述生產的具體產品 | | 工廠標準 | 具體工廠的父類 | 描述工廠的公共介面 | | 具體工廠 | 工廠標準的具體實現類 | 描述生產的具體產品的工廠 | ## UML類圖 ![工廠方法模式UML類圖](https://img2020.cnblogs.com/blog/451958/202008/451958-20200806171758822-1706500412.png) ## 使用步驟 1. 建立產品標準 (描述產品的公共介面) 2. 建立具體產品類 (描述生產的具體產品) 3. 建立工廠標準(描述工廠的公共介面) 4. 建立具體工廠類(描述生產的具體產品的工廠) 5. 外界通過呼叫具體工廠類的方法,從而建立不同具體產品類的例項 ## 優點 - 更符合開-閉原則 > 新增一種產品時,只需要增加相應的具體產品類和相應的工廠子類即可 - 符合單一職責原則 > 每個具體工廠類只負責建立對應的產品 ## 缺點 > 新增新產品時,除了增加新產品類外,還要提供與之對應的具體工廠類,系統類的個數將成對增加,在一定程度上增加了系統的複雜度; 同時,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷; > 雖然保證了工廠方法內的對修改關閉,但對於使用工廠方法的類,如果要更換另外一種產品,仍然需要修改例項化的具體工廠類; > 一個具體工廠只能建立一種具體產品 ## 適用場景 - 當一個類不知道它所需要的物件的類時 > 在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可; - 當一個類希望通過其子類來指定建立物件時 > 在工廠方法模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的物件, > 利用面向物件的多型性和里氏代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。 - 靈活配置 > 將建立物件的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類建立產品子類, > 需要時再動態指定,可將具體工廠類的類名儲存在配置檔案或資料庫中。 # 總結 > 盡信書不如無書,任何脫離實際業務的架構都是在耍流氓; > 所謂原則,只是為了更好地為我們服務; > 具體如何應用需要我們在業務實踐中靈活把控。