工廠模式基本與簡單工廠模式差不多,上面也說了,每次新增乙個產品子類都必須在工廠類中新增乙個判斷分支,這樣違背了開放-封閉原則,因此,工廠模式就是為了解決這個問題而產生的。
既然每次都要判斷,那就把這些判斷都生成乙個工廠子類,這樣,每次新增產品子類的時候,只需再新增乙個工廠子類就可以了。這樣就完美的遵循了開放-封閉原則。但這其實也有問題,如果產品數量足夠多,要維護的量就會增加,好在一般工廠子類只用來生成產品類,只要產品子類的名稱不發生變化,那麼基本工廠子類就不需要修改,每次只需要修改產品子類就可以了。
同樣工廠模式一般應該於程式中大部分地方都只使用其中一種產品,工廠類也不用頻繁建立產品類的情況。這樣修改的時候只需要修改有限的幾個地方即可。
簡單工廠模式是工廠模式中最簡單的一種,他可以用比較簡單的方式隱藏建立物件的細節,一般只需要告訴工廠類所需要的型別,工廠類就會返回需要的產品類,但客戶端看到的只是產品的抽象物件,無需關心到底是返回了哪個子類。客戶端唯一需要知道的具體子類就是工廠子類。除了這點,基本是達到了依賴倒轉原則的要求。
所以簡單工廠模式一般應該於程式中大部分地方都只使用其中一種產品,工廠類也不用頻繁建立產品類的情況。這樣修改的時候只需要修改有限的幾個地方即可。
優點:1.隱藏了物件建立的細節,將產品的例項化推遲到子類中實現。
2.客戶端基本不用關心使用的是哪個產品,只需要知道用哪個工廠就行了,提供的型別也可以用比較便於識別的字串。
3.方便新增新的產品子類,每次只需要修改工廠類傳遞的型別值就行了。
4.遵循了依賴倒轉原則。
缺點:1.要求產品子類的型別差不多,使用的方法名都相同,如果模擬較多,而所有的類又必須要新增一種方法,則會是非常麻煩的事情。或者是一種類另一種類有幾種方法不相同,客戶端無法知道是哪乙個產品子類,也就無法呼叫這幾個不相同的方法。
2.每新增乙個產品子類,都必須在工廠類中新增乙個判斷分支,這違背了開放-封閉原則。
比工廠模式更為複雜,就像上面提到的缺點一樣,工廠模式和簡單工廠模式要求產品子類必須要是同一型別的,擁有共同的方法,這就限制了產品子類的擴充套件。於是為了更加方便的擴充套件,抽象工廠模式就將同一類的產品子類歸為一類,讓他們繼承同乙個抽象子類,我們可以把他們一起視作一組,然後好幾組產品構成一族。
此時,客戶端要使用時必須知道是哪乙個工廠並且是哪一組的產品抽象類。每乙個工廠子類負責產生一族產品,而子類的一種方法產生一種型別的產品。在客戶端看來只有abstractproducta和abstractproductb兩種產品,使用的時候也是直接使用這兩種產品。而通過工廠來識別是屬於哪一族產品
抽象工廠模式就變得比工廠模式更為複雜,就像上面提到的缺點一樣,工廠模式和簡單工廠模式要求產品子類必須要是同一型別的,擁有共同的方法,這就限制了產品子類的擴充套件。於是為了更加方便的擴充套件,抽象工廠模式就將同一類的產品子類歸為一類,讓他們繼承同乙個抽象子類,我們可以把他們一起視作一組,然後好幾組產品構成一族。
此時,客戶端要使用時必須知道是哪乙個工廠並且是哪一組的產品抽象類。每乙個工廠子類負責產生一族產品,而子類的一種方法產生一種型別的產品。在客戶端看來只有abstractproducta
和abstractproductb兩種產品,使用的時候也是直接使用這兩種產品。而通過工廠來識別是屬於哪一族產品
工廠方法模式中抽象工廠類負責建立物件的介面,具體物件的建立工作的工廠由實現工廠介面的具體類來完成。
public inte***ce factory
public abstract class animal
public class catfactory implements factory
}public class dog extends animal
}public static void main(string args)
回顧下簡單工廠模式的主要內容:簡單工廠模式就是實質就是專門定義了乙個工廠類,利用工廠類的靜態方法來根據使用者需求建立物件,優點是客戶端的壓力較小,客戶端不需要做建立例項的操作,只需要呼叫工廠類中的方法就可以獲得對應例項,而其缺點也非常明顯,其所有建立工作都在乙個工廠類完成,耦合性較高,而且當系統需要增加或者修改產品時需要改動工廠類,既不符合單一職責的原則也不符合開放-關閉原則,所以就出現了工廠模式。
工廠模式是對簡單工廠模式的進一步抽象化,是簡答工廠模式的衍生,根據設計模式的基本原則也是設計模式的精髓「封裝變化點」,即**發生改變就把**封裝起來,所以工廠模式對簡單工廠中的工廠類做了乙個封裝,使其滿足單一職責和開放-關閉原則。
建立物件的三種方式
【解決問題】:簡單工廠模式中違背了單一職責和開放-關閉原則。
【核心思想】:建立乙個抽象工廠的基類,給每個產品建立乙個工廠,該工廠繼承之抽象工廠,規定每個產品都有特定的工廠來建立。
【角色】
抽象工廠角色:這是工廠模式的核心,它與應用程式無關,是具體工廠必須繼承的父類或者必須實現的介面
具體工廠角色:包含邏輯業務的**,由應用程式呼叫以建立對應的具體產品物件
抽象產品角色:具體產品必須繼承的父類或者必須實現的介面具體產品角色:所建立的物件就是此角色的例項。
-end-
java中的設計模式 工廠 和抽象工廠模式 的例子
工廠模式 package com.wepull.note1125 public inte ce factory package com.wepull.note1125 public inte ce com package com.wepull.note1125 public class hbcomf...
設計模式中的工廠模式使用
首先要談到乙個概念,抽象類和抽象方法。抽象類本質上還是乙個類,只不過這個類抽出來的一些公用的方法。這些方法是他的子類都必須使用到的,而且每個子類的對這個方法的執行內容是不一樣的。比如 public abstract class ruleelse if tbname.equals putablexmh...
三個工廠模式的分析
學習設計模式很長時間了,一直想把這些模式進行分類和總結,卻不知道從 開始。發現工廠模式是乙個系列,就從三個工廠模式說起吧。首先來說簡單工廠模式,以設計計算器為例分析這個模式,簡單工廠模式抽象出了乙個業務邏輯的父類,父類定義了定義了屬性和方法,子運算類只需要重寫運算方法即可,客戶端負責輸入和輸出資料,...