簡單原廠模式:
簡單原廠模式的工廠類一般是使用靜態方法,通過接收的參數不同來返回不同的對象的執行個體,不修改代碼的話,是無法擴充的
Factory 方法模式
Factory 方法模式是針對每一種產品提供一個工廠類,通過不同的工廠執行個體來建立不同的產品執行個體。
在同一等級結構中,支援增加任意產品
抽象原廠模式:
抽象原廠模式應對產品族的概念。比如說,每個汽車公司可能要同時生產轎車,火車,客車,那麼每一個工廠都要有建立橋車,貨車和客車的方法。
應對產品族的概念而生,增加新的產品線很容易,但是無法增加新的產品。
小結:
原廠模式中,重要的是工廠類,而不是產品類。產品類可以是多種形式,多層繼承或者單個類都是可以的。但是要明確的是,原廠模式的介面只會返回一種類型的執行個體。這是在設計產品類的時候需要注意的,最好是有父類或者共同實現的介面。
使用原廠模式,返回的執行個體一定是工廠建立的,而不是從其他對象中擷取的。
原廠模式返回的執行個體可以不是新建立的,返回由原廠模式建立好的執行個體也是可以的。
區別:
簡單原廠模式:用來生產同一等級結構中的任意產品。對與增加新的產品,無能為力
原廠模式 :用來生產同一等級結構中的固定產品。(支援增加任意產品)
抽象工廠 :用來生產不同產品族的全部產品。(對於增加新的產品,無能為力;支援增加產品族)
以上三種工廠 方法在等級結構和產品族這兩個方向上的支援程度不同。所以要根據情況考慮應該使用哪種方法
:
FAQ:
1. Factory 方法模式,抽象原廠模式區別:
Factory 方法模式:
一個抽象產品類,可以派生出多個具體產品類。一個抽象工廠類,可以派生出多個具體工廠類。每個具體工廠類只能建立一個具體產品類的執行個體。
抽象原廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。一個抽象工廠類,可以派生出多個具體工廠類。每個具體工廠類可以建立多個具體產品類的執行個體。
區別:
Factory 方法模式只有一個抽象產品類,而抽象原廠模式有多個。
Factory 方法模式的具體工廠類只能建立一個具體產品類的執行個體,而抽象原廠模式可以建立多個。
2. 簡單原廠模式,Factory 方法模式,抽象原廠模式區別:
簡單原廠模式,Factory 方法模式和抽象原廠模式都屬於建立型設計模式,這三種建立型模式都不需要知道具體類。我們掌握一種思想,就是在建立對象時,需要要容易發生變化的地方給封裝起來,來控制變化,以適應客戶的變動,項目的擴充。
特點:
簡單原廠模式:
專門定義一個類負責建立其他類的執行個體,被建立的執行個體通常都具有共同的父類。它又稱為靜態Factory 方法模式。它的實質是由一個工廠類根據傳入的參數,動態決定應該建立哪一個產品類(這些產品類繼承自一個父類或介面)的執行個體。簡單原廠模式的建立目標,所有建立的對象都是充當這個角色的某個具體類的執行個體。在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的對象。使用者在使用時可以直接根據工廠類去建立所需的執行個體。而無需瞭解這些對象時如何建立以及如何組織的。有利於整個軟體體繫結構的最佳化。
Factory 方法模式:
Factory 方法是粒度很小的設計模式,因為模式的表現只是一個抽象的方法。提前定義用於建立對象的介面,讓子類決定執行個體化具體的某一個類,即在工廠和產品中間增加介面,工廠不再負責產品的建立,由介面針對不同條件返回具體的類執行個體,由具體類執行個體去實現。Factory 方法模式是簡單原廠模式的衍生,解決了許多簡單原廠模式的問題。首先完全實現”開—閉 原則”,實現了可擴充。其次實現了更複雜的階層,可以應用於產品結果複雜的場合。Factory 方法模式是對簡單原廠模式的抽象。有個抽象的Factory類(可以是抽象類別和介面),這個類將不負責具體的產品生產,而是只制定一些規範,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品。這個具體的工廠就負責生產對應的產品。
抽象原廠模式:
抽象原廠模式是所有形態的原廠模式中最為抽象和最具一般性的形態。抽象原廠模式是指當有多個抽象角色時,使用的一種原廠模式。抽象原廠模式可以向用戶端提供一個介面,使用戶端在不必指定產品的具體的情況下,建立多個產品族中得產品對象。它有多個抽象產品類,每個抽象產品類可以派生出多個具體產品類,一個抽象工廠類,可以派生出多個具體工廠類,每個具體工廠類可以建立多個具體產品類的執行個體。
每一種模式都是針對一定問題的解決方案,Factory 方法模式針對的是一個產品等級結構;而抽象原廠模式針對的是多個產品等級結構。
優點:
簡單原廠模式:
工廠類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的執行個體,用戶端可以免除直接建立產品對象的責任,而僅僅“消費”產品。簡單原廠模式通過這種做法實現了對責任的分割。簡單原廠模式能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的對象。通過它。外界可以從直接建立具體產品對象的尷尬局面中拍拖出來。外界與具體類隔離出來,耦合性低。明確區分了各自的職責和權力,有利於整個軟體體繫結構的最佳化。
Factory 方法模式:
Factory 方法模式是為了克服簡單原廠模式的缺點而設計出來的。簡單原廠模式的工廠類隨著產品類的增加而需要增加很多方法(或代碼),而Factory 方法模式每個具體工廠類只完成單一任務,代碼簡潔。Factory 方法模式完全滿足OCP,即它具有非常良好的擴充性。
抽象原廠模式:
抽象原廠模式主要在於應對“新系列”的需求變化。分離了具體的類,抽象原廠模式協助你控制一個應用建立的對象的類,因為一個工廠封裝建立產品對象的責任和過程。它將客戶和類的實現分離,客戶通過他們的抽象介面操縱執行個體,產品的類名也在具體工廠的實現中被分離,他們不出現在客戶代碼中。它使得易於交換產品系列。一個具體工廠類在一個應用中僅出現一次----即在它初始化的時候。這使得改變一個應用的具體工廠變得很容易。它只需改變具體的工廠即可使用不同的產品配置,這是因為一個抽象工廠建立了一個完整的產品系列,所以整個產品系列會立刻改變。它有利於產品的一致性。當一個系列的產品對象被設計成一起工作時,一個應用一次只能使用同一個系列中得對象,這一點很重要,而抽象工廠很容易實現這一點。抽象原廠模式有助於這樣的團隊分工,降低了模組間的耦合性,提高了團隊開發效率。
缺點:
簡單原廠模式:
當產品有複雜的多層等級結構時,工廠類只有自己,以不變應萬變,就是模式的缺點。因為工廠類集中了所有產品的建立邏輯,一但不能正常工作,整個系統都要受到影響。系統擴充困難,一旦添加新產品就不得不修改工廠邏輯,有可能造成工廠邏輯過於複雜,違背了“開發—封閉”原則。另外,簡單原廠模式通常使用靜態Factory 方法,這使得無法由子類繼承,造成工廠角色無法形成基於繼承的等級結構。
Factory 方法模式:
不易於維護,假如某個具體產品類需要進行一定的修改,很可能需要修改對應的工廠類。當同時需要修改多個產品類的時候,對工廠類的修改會變得相當麻煩(對號入座已經是個問題了)
抽象原廠模式:
抽象原廠模式在於難於應付”新對象”的需求變動。難以支援新種類的產品。難以擴充抽象工廠以生產新種類產品。這是因為抽象工廠幾乎確定了可以被建立的產品的集合。支援新種類的產品就需要擴充該工廠介面,這將涉及抽象工廠及其所有子類的改變。
適用範圍
簡單原廠模式:
工廠類負責建立的對象較少,客戶只知道傳入工廠類的參數,對於如何建立對象不關心。
Factory 方法模式:
當一個類不知道它所必須建立對象的類或一個類希望由子類來指定它所建立的對象時,當類將建立對象的職責委託給多個協助子類中得某一個,並且你希望將哪一個協助子類是代理者這一資訊局部化的時候,可以使用Factory 方法模式。
抽象原廠模式:
一個系統不應當依賴於產品類執行個體何如被建立,組合和表達的細節,這對於所有形態的原廠模式都是重要的。這個系統有多於一個的產品族,而系統只消費其中某一產品族。同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於實現。
其實,無論是簡單原廠模式、原廠模式還是抽象原廠模式,它們本質上都是將不變的部分提取出來,將可變的部分留作介面,以達到最大程度上的複用。究竟用哪種設計模式更適合,這要根據具體的業務需求來決定