分析工厂模式中的问题并改造
工廠模式基本與簡單工廠模式差不多,上面也說了,每次添加一個產品子類都必須在工廠類中添加一個判斷分支,這樣違背了開放-封閉原則,因此,工廠模式就是為了解決這個問題而產生的。
既然每次都要判斷,那就把這些判斷都生成一個工廠子類,這樣,每次添加產品子類的時候,只需再添加一個工廠子類就可以了。這樣就完美的遵循了開放-封閉原則。但這其實也有問題,如果產品數(shù)量足夠多,要維護的量就會增加,好在一般工廠子類只用來生成產品類,只要產品子類的名稱不發(fā)生變化,那么基本工廠子類就不需要修改,每次只需要修改產品子類就可以了。
同樣工廠模式一般應該于程序中大部分地方都只使用其中一種產品,工廠類也不用頻繁創(chuàng)建產品類的情況。這樣修改的時候只需要修改有限的幾個地方即可。
簡單工廠模式是工廠模式中最簡單的一種,他可以用比較簡單的方式隱藏創(chuàng)建對象的細節(jié),一般只需要告訴工廠類所需要的類型,工廠類就會返回需要的產品類,但客戶端看到的只是產品的抽象對象,無需關心到底是返回了哪個子類。客戶端唯一需要知道的具體子類就是工廠子類。除了這點,基本是達到了依賴倒轉原則的要求。
所以簡單工廠模式一般應該于程序中大部分地方都只使用其中一種產品,工廠類也不用頻繁創(chuàng)建產品類的情況。這樣修改的時候只需要修改有限的幾個地方即可。
優(yōu)點:
1.隱藏了對象創(chuàng)建的細節(jié),將產品的實例化推遲到子類中實現(xiàn)。
2.客戶端基本不用關心使用的是哪個產品,只需要知道用哪個工廠就行了,提供的類型也可以用比較便于識別的字符串。
3.方便添加新的產品子類,每次只需要修改工廠類傳遞的類型值就行了。
4.遵循了依賴倒轉原則。
缺點:
1.要求產品子類的類型差不多,使用的方法名都相同,如果類比較多,而所有的類又必須要添加一種方法,則會是非常麻煩的事情。或者是一種類另一種類有幾種方法不相同,客戶端無法知道是哪一個產品子類,也就無法調用這幾個不相同的方法。
2.每添加一個產品子類,都必須在工廠類中添加一個判斷分支,這違背了開放-封閉原則。
1、抽象工廠模式
比工廠模式更為復雜,就像上面提到的缺點一樣,工廠模式和簡單工廠模式要求產品子類必須要是同一類型的,擁有共同的方法,這就限制了產品子類的擴展。于是為了更加方便的擴展,抽象工廠模式就將同一類的產品子類歸為一類,讓他們繼承同一個抽象子類,我們可以把他們一起視作一組,然后好幾組產品構成一族。
此時,客戶端要使用時必須知道是哪一個工廠并且是哪一組的產品抽象類。每一個工廠子類負責產生一族產品,而子類的一種方法產生一種類型的產品。在客戶端看來只有AbstractProductA和AbstractProductB兩種產品,使用的時候也是直接使用這兩種產品。而通過工廠來識別是屬于哪一族產品
2、工廠方法模式
抽象工廠模式就變得比工廠模式更為復雜,就像上面提到的缺點一樣,工廠模式和簡單工廠模式要求產品子類必須要是同一類型的,擁有共同的方法,這就限制了產品子類的擴展。于是為了更加方便的擴展,抽象工廠模式就將同一類的產品子類歸為一類,讓他們繼承同一個抽象子類,我們可以把他們一起視作一組,然后好幾組產品構成一族。
此時,客戶端要使用時必須知道是哪一個工廠并且是哪一組的產品抽象類。每一個工廠子類負責產生一族產品,而子類的一種方法產生一種類型的產品。在客戶端看來只有AbstractProductA
和AbstractProductB兩種產品,使用的時候也是直接使用這兩種產品。而通過工廠來識別是屬于哪一族產品
工廠方法模式中抽象工廠類負責創(chuàng)建對象的接口,具體對象的創(chuàng)建工作的工廠由實現(xiàn)工廠接口的具體類來完成。
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(); }回顧下簡單工廠模式的主要內容:簡單工廠模式就是實質就是專門定義了一個工廠類,利用工廠類的靜態(tài)方法來根據(jù)用戶需求創(chuàng)建對象,優(yōu)點是客戶端的壓力較小,客戶端不需要做創(chuàng)建實例的操作,只需要調用工廠類中的方法就可以獲得對應實例,而其缺點也非常明顯,其所有創(chuàng)建工作都在一個工廠類完成,耦合性較高,而且當系統(tǒng)需要增加或者修改產品時需要改動工廠類,既不符合單一職責的原則也不符合開放-關閉原則,所以就出現(xiàn)了工廠模式。
工廠模式是對簡單工廠模式的進一步抽象化,是簡答工廠模式的衍生,根據(jù)設計模式的基本原則也是設計模式的精髓“封裝變化點”,即哪里發(fā)生改變就把哪里封裝起來,所以工廠模式對簡單工廠中的工廠類做了一個封裝,使其滿足單一職責和開放-關閉原則。
創(chuàng)建對象的三種方式
【解決問題】:簡單工廠模式中違背了單一職責和開放-關閉原則。
【核心思想】:建立一個抽象工廠的基類,給每個產品建立一個工廠,該工廠繼承之抽象工廠,規(guī)定每個產品都有特定的工廠來創(chuàng)建。
【角色】
抽象工廠角色:這是工廠模式的核心,它與應用程序無關,是具體工廠必須繼承的父類或者必須實現(xiàn)的接口
具體工廠角色:包含邏輯業(yè)務的代碼,由應用程序調用以創(chuàng)建對應的具體產品對象
抽象產品角色:具體產品必須繼承的父類或者必須實現(xiàn)的接口具體產品角色:所創(chuàng)建的對象就是此角色的實例。
-END-轉載于:https://blog.51cto.com/14295469/2398204
總結
以上是生活随笔為你收集整理的分析工厂模式中的问题并改造的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10下安装ubuntu,双系统,免
- 下一篇: 2019-05-21 Java学习日记之