工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優點,同時還彌補了簡單工廠模式的缺陷,更好地符合開閉原則的要求,在增加新的具體產品物件時不需要對已有系統做任何修改。
在工廠方法模式中不再提供乙個統一的工廠類來建立所有的產品物件,而是針對不同的產品提供不同的工廠,系統提供乙個與產品等級結構對應的工廠等級結構。
定義如下:
工廠方法模式:定義乙個用於建立物件的介面,但是讓子類決定將哪乙個類例項化。
工廠方法模式讓乙個類的例項化延遲到其子類。
factory method pattern:define an inte***ce for creating an object,but let subclasses decide
which class to instantiate.factory method lets a class defer instantiation to subclasses.
工廠方法模式簡稱為工廠模式(factory pattern),又可稱為虛擬構造器模式(virtual constructor pattern)或多型工廠模式(polymorphic factory pattern)。工廠方法模式是一種類建立模式。
工廠方法模式包含抽象產品、具體產品、抽象工廠與具體工廠4個角色。
在某些情況下,可以通過多種方式來初始化同乙個產品類。在抽象工廠中宣告了多個過載的工廠方法,在具體工廠中實現了這些工廠方法,這些方法可以包含不同的業務邏輯,以滿足產品物件的多樣化建立需求。
有時候,為了進一步簡化客戶端的使用,還可以對客戶端隱藏工廠方法,此時在工廠類中直接呼叫產品類的業務方法,客戶端無須呼叫工廠方法建立產品物件,直接使用工廠物件即可呼叫所建立的產品物件中的業務方法。
通過把業務方法的呼叫移至工廠類中,可以直接使用工廠物件來呼叫產品物件的業務方法,客戶端無須使用工廠方法來建立產品物件。在某些情況下可以使用這種設計方案。
工廠方法模式是使用頻率最高的設計模式之一,是很多開源框架和api類庫的核心模式。
在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠自主確定建立何種產品物件,而如何建立這個物件的細節完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,正是因為所有的具體工廠類都具有同一抽象父類。
使用工廠方法模式的另乙個優點是在系統中加入新產品時無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品即可,這樣系統的可擴充套件性也就變得非常好,完全符合開閉原則。
在新增新產品時需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度。
客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體產品物件由具體工廠類建立,可將具體工廠類的類名儲存在配置檔案或資料庫中。
抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。
Java設計模式之工廠方法模式
l 工廠方法模式概述 工廠方法模式中抽象工廠類負責定義建立物件的介面,具體物件的建立工作由繼承抽象工廠的具體類實現。l 優點 客戶端不需要在負責物件的建立,從而明確了各個類的職責,如果有新的物件增加,只需要增加乙個具體的類和具體的工廠類即可,不影響已有的 後期維護容易,增強了系統的擴充套件性 l 缺...
Java設計模式之 工廠方法模式
工廠方法模式分為三種 普通工廠模式 多個工廠方法模式 靜態工廠方法模式。1 普通工廠模式 以發郵件和簡訊的例子說明。結構如下圖所示 主要分為四個步驟 建立各例項的共同介面 建立各功能例項 建立工廠 主程式。請看如下示例 public class factorymethodmodel 建立二者的共同介...
java設計模式之工廠方法模式
工廠方法模式分為三種 1 普通工廠模式 2 多個工廠模式 3 靜態工廠模式 1 定義乙個介面類 package com.dairuijie.factory 動物介面 author drjyy public inte ce anaimal 2 定義實現介面的類 package com.dairuiji...