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