在設計模式中的創建者模式中有三中模式可以說是同根同源。它們就是簡單工廠模式、工廠模式、抽象工廠模式。下面我們逐一看它們的特點以及異同。
1、簡單工廠模式
簡單工廠模式并不在GoF的23種設計模式之列,不過它卻是工廠模式和抽象工廠模式最簡化的一種表現形式。它通過一個工廠類Factory來根據傳入的參數決定構建具體哪一類產品的實例。它屏蔽了客戶端創建具體產品實例的過程,提供給客戶端可用的對象。但是它有一個致命的缺點就是Factory中的邏輯比較負責,要根據參數去判斷生成怎么樣的產品實例給客戶端。特別是產品實例動態的增加的時候,你必須要修改Factory的判斷邏輯,這一點違背了“開-閉原則”。可能這也是它未能入選23種設計模式的原因吧。
上uml圖吧,這樣更易于理解(圖來源于百度百科)
2、工廠模式
如果說什么模式應用最多,個人認為就是工廠模式了。例如想Spring中Factory,Bean實在是太常見了。你自己平時寫程序,new一個對象也是非常常見的,所以工廠模式常見也是非常正常。如果要說工廠模式和抽象工廠模式的區別,那就要先看抽象工廠的缺點了,違背了“開-閉”原則。所以工廠模式,就作出了改進,每一個Product都有一個自己對應的工廠。當然這些工廠都繼承于抽象工廠類,并實現了工廠方法。
上uml圖吧,自己可以對比一下,圖片來源于大話設計模式
3、抽象工廠模式
看了上面的工廠模式,你是不是會覺得很爽,因為大部分new出來的對象都可以用工廠去產生,確實,在Spring中,所有的類成員變量都是配置文件配進去的,也就是通過工廠產生的。但是你會發現一個問題,如果是一個工廠只產生一個bean,那么如果我想產生一組bean怎么辦呢?因為很多時候某一組bean是捆綁在一起的。例如db中,sqlServer,mysql,oracle各自對應一組Connection, resultSet等,那是你這個時候就需要抽象工廠了,它提供了這樣對一組or一類bean區分的需求的支持。
上uml圖吧,偶覺得有圖有真相,呵呵。圖片仍舊來自大話設計模式。
4、總結
通過上面的介紹和圖例,基本可以看出三種工廠模式的特點和異同。主要是它們的不同點,簡單工廠封裝了構建對象的過程,但內部存在判斷邏輯,所以違背了“開-閉”原則。工廠模式通過對每一個product增加一個工廠去增加彌補這個缺點。但是工廠模式又不能生成同一類型的多個product,所以抽象工廠模式通過增加多個工廠方法去解決這個問題。
最后附上文檔的pdf吧。呵呵,希望對設計模式初學者有用。
/Files/zhenxuanpan/設計模式之三種工廠.pdf