分析工廠模式中的問題並改造

工廠模式基本與簡單工廠模式差很少,上面也說了,每次添加一個產品子類都必須在工廠類中添加一個判斷分支,這樣違背了開放-封閉原則,所以,工廠模式就是爲了解決這個問題而產生的。設計模式

既然每次都要判斷,那就把這些判斷都生成一個工廠子類,這樣,每次添加產品子類的時候,只需再添加一個工廠子類就能夠了。這樣就完美的遵循了開放-封閉原則。但這其實也有問題,若是產品數量足夠多,要維護的量就會增長,好在通常工廠子類只用來生成產品類,只要產品子類的名稱不發生變化,那麼基本工廠子類就不須要修改,每次只須要修改產品子類就能夠了。spa

一樣工廠模式通常應該於程序中大部分地方都只使用其中一種產品,工廠類也不用頻繁建立產品類的狀況。這樣修改的時候只須要修改有限的幾個地方便可。設計

簡單工廠模式是工廠模式中最簡單的一種,他能夠用比較簡單的方式隱藏建立對象的細節,通常只須要告訴工廠類所須要的類型,工廠類就會返回須要的產品類,但客戶端看到的只是產品的抽象對象,無需關心究竟是返回了哪一個子類。客戶端惟一須要知道的具體子類就是工廠子類。除了這點,基本是達到了依賴倒轉原則的要求。3d

因此簡單工廠模式通常應該於程序中大部分地方都只使用其中一種產品,工廠類也不用頻繁建立產品類的狀況。這樣修改的時候只須要修改有限的幾個地方便可。code

優勢:
1.隱藏了對象建立的細節,將產品的實例化推遲到子類中實現。
2.客戶端基本不用關心使用的是哪一個產品,只須要知道用哪一個工廠就好了,提供的類型也能夠用比較便於識別的字符串。
3.方便添加新的產品子類,每次只須要修改工廠類傳遞的類型值就好了。
4.遵循了依賴倒轉原則。
對象

缺點:
1.要求產品子類的類型差很少,使用的方法名都相同,若是類比較多,而全部的類又必需要添加一種方法,則會是很是麻煩的事情。或者是一種類另外一種類有幾種方法不相同,客戶端沒法知道是哪個產品子類,也就沒法調用這幾個不相同的方法。
2.每添加一個產品子類,都必須在工廠類中添加一個判斷分支,這違背了開放-封閉原則。
blog

一、抽象工廠模式

比工廠模式更爲複雜,就像上面提到的缺點同樣,工廠模式和簡單工廠模式要求產品子類必需要是同一類型的,擁有共同的方法,這就限制了產品子類的擴展。因而爲了更加方便的擴展,抽象工廠模式就將同一類的產品子類歸爲一類,讓他們繼承同一個抽象子類,咱們能夠把他們一塊兒視做一組,而後好幾組產品構成一族。繼承

此時,客戶端要使用時必須知道是哪個工廠而且是哪一組的產品抽象類。每個工廠子類負責產生一族產品,而子類的一種方法產生一種類型的產品。在客戶端看來只有AbstractProductA和AbstractProductB兩種產品,使用的時候也是直接使用這兩種產品。而經過工廠來識別是屬於哪一族產品接口

二、工廠方法模式

抽象工廠模式就變得比工廠模式更爲複雜,就像上面提到的缺點同樣,工廠模式和簡單工廠模式要求產品子類必需要是同一類型的,擁有共同的方法,這就限制了產品子類的擴展。因而爲了更加方便的擴展,抽象工廠模式就將同一類的產品子類歸爲一類,讓他們繼承同一個抽象子類,咱們能夠把他們一塊兒視做一組,而後好幾組產品構成一族。字符串

此時,客戶端要使用時必須知道是哪個工廠而且是哪一組的產品抽象類。每個工廠子類負責產生一族產品,而子類的一種方法產生一種類型的產品。在客戶端看來只有AbstractProductA

和AbstractProductB兩種產品,使用的時候也是直接使用這兩種產品。而經過工廠來識別是屬於哪一族產品

工廠方法模式中抽象工廠類負責建立對象的接口,具體對象的建立工做的工廠由實現工廠接口的具體類來完成。

public interface Factory { public abstract Animal createAnimal(); } public abstract class Animal { public abstract void eat(); } public class CatFactory implements Factory { public Animal createAnimal() { return new Cat(); } } public class Dog extends Animal { public void eat() { } } public static void main(String[] args) { Factory f = new DogFactory(); f.createAnimal().eat(); f = new CatFactory(); f.createAnimal().eat(); }

回顧下簡單工廠模式的主要內容:簡單工廠模式就是實質就是專門定義了一個工廠類,利用工廠類的靜態方法來根據用戶需求建立對象,優勢是客戶端的壓力較小,客戶端不須要作建立實例的操做,只須要調用工廠類中的方法就能夠得到對應實例,而其缺點也很是明顯,其全部建立工做都在一個工廠類完成,耦合性較高,並且當系統須要增長或者修改產品時須要改動工廠類,既不符合單一職責的原則也不符合開放-關閉原則,因此就出現了工廠模式。

工廠模式是對簡單工廠模式的進一步抽象化,是簡答工廠模式的衍生,根據設計模式的基本原則也是設計模式的精髓「封裝變化點」,即哪裏發生改變就把哪裏封裝起來,因此工廠模式對簡單工廠中的工廠類作了一個封裝,使其知足單一職責和開放-關閉原則。

建立對象的三種方式

【解決問題】:簡單工廠模式中違背了單一職責和開放-關閉原則。

【核心思想】:創建一個抽象工廠的基類,給每一個產品創建一個工廠,該工廠繼承之抽象工廠,規定每一個產品都有特定的工廠來建立。

【角色】

抽象工廠角色:這是工廠模式的核心,它與應用程序無關,是具體工廠必須繼承的父類或者必須實現的接口

具體工廠角色:包含邏輯業務的代碼,由應用程序調用以建立對應的具體產品對象

抽象產品角色:具體產品必須繼承的父類或者必須實現的接口具體產品角色:所建立的對象就是此角色的實例。

-END-
相關文章
相關標籤/搜索