更新時(shí)間:2020-09-11 15:34:55 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1735次
工廠模式作為設(shè)計(jì)模式的一種在開(kāi)發(fā)中被普遍使用,
其實(shí)應(yīng)該可以說(shuō)是最經(jīng)常使用的一種的了。
它的設(shè)計(jì)思想也是面向接口,如果細(xì)分下來(lái),可以分成兩種工廠模式
·工廠方法-Factory Method
·抽象工廠-Abstract Factory
今天先把Factory Method說(shuō)完,因?yàn)锳bstract Factory的實(shí)現(xiàn)跟Factory Method有點(diǎn)相似,為了區(qū)分我們還是明天再接著說(shuō)Abstract Factory。
工廠方法-Factory Method
剛接觸工廠模式的同學(xué)可能很容易被名字混淆,工廠這個(gè)工廠那個(gè)的,
我建議是直接記英文,這樣不容易混淆兩者的概念和實(shí)現(xiàn),畢竟像"抽象","方法"這兩個(gè)詞,在文章中出現(xiàn)頻率非常高,會(huì)產(chǎn)生閱讀疲勞。
所以下面我們統(tǒng)一用Factory Method來(lái)說(shuō)明吧。
舉例
講抽象原理不如直接上例子來(lái)的直接。
舉個(gè)簡(jiǎn)單的例子,現(xiàn)在需要獲得不同的顏色,在沒(méi)有使用Factory Method之前,我們的代碼看起來(lái)可能是這樣的
Red red=new Red();Green green=new Green();B·ue b·ue=new B·ue();....red.paint();green.paint();b·ue.paint();
這樣沒(méi)有什么問(wèn)題,但是代碼不夠靈活。試想一下如果我們不想要紅色了,要修改Red變成Ye··ow,除了實(shí)例化的代碼,下面還有引用的代碼,要改的地方就很多了。
而且從使用者的抽象角度來(lái)說(shuō),新建對(duì)象是一個(gè)過(guò)程,而不是一個(gè)操作,使用者需要關(guān)心具體的實(shí)例化過(guò)程,和實(shí)例化的使用,這不是面向?qū)ο蟮暮盟悸贰?/p>
Factory Method可以解決這種問(wèn)題,它把使用者和實(shí)例的生產(chǎn)邏輯解耦,從而讓使用者只關(guān)心實(shí)例的使用過(guò)程。
Factory Method
對(duì)于以上代碼,可以看出每個(gè)顏色都有共同的方法paint(),這可以作為一個(gè)方法抽象出來(lái),
interface Co·or{void paint();}
具體的顏色類,這里只舉一個(gè)類,其他都一樣,
pub·ic c·ass Red imp·ements Co·or{pub·ic void paint(){System.out.print·n("paint red");}}
Factory
對(duì)于Factory來(lái)說(shuō),它負(fù)責(zé)具體的實(shí)例生產(chǎn)過(guò)程,
可以這么想象,我不關(guān)心Red實(shí)例是怎么來(lái)的,我只告訴Factory我要什么顏色,F(xiàn)actory交給我之后,我只需要調(diào)用paint()接口就行。
所以對(duì)于調(diào)用者來(lái)說(shuō),現(xiàn)在的代碼可能是這樣的,
Co·or co·or=Co·orFactory.create("red");....co·or.paint();
現(xiàn)在看,是不是在調(diào)用者的代碼里完全沒(méi)有出現(xiàn)跟實(shí)例生產(chǎn)相關(guān)的代碼了?
即使后面需要修改具體的顏色,也只需要改掉create("red")里的參數(shù)就可以。
現(xiàn)在來(lái)看看Factory的代碼,
c·ass Co·orFactory{pub·ic static Co·or create(String co·or){switch(co·or){case"red":return new Red();break;....}}}
為了簡(jiǎn)化代碼這里只列出了Red相關(guān)的引用。
so…這就是Factory Method的精髓所在,通過(guò)Factory把實(shí)例的生產(chǎn)過(guò)程隱藏起來(lái)。
但如果你想深一層,這樣的簡(jiǎn)易版Factory Method也會(huì)有問(wèn)題。
如果后面引入的顏色越來(lái)越多,Co·orFactory的代碼量就會(huì)變得越來(lái)越長(zhǎng),如果實(shí)例化的細(xì)節(jié)足夠復(fù)雜,那么Co·orFactory也會(huì)變成一個(gè)超級(jí)上帝類。
Factory Method的進(jìn)化版
為了避免Co·orFactory被迭代到超級(jí)上帝類,可以進(jìn)一步優(yōu)化代碼。
對(duì)于Factory來(lái)說(shuō),它只關(guān)心一件事情,就是生產(chǎn)實(shí)例,所以對(duì)于這部分的操作,可以抽象出來(lái)作為一個(gè)接口create(),
interface Factory{Co·or create();}
現(xiàn)在開(kāi)始,我們就可以拋棄Co·orFactory這個(gè)超級(jí)上帝類了,對(duì)于每種Co·or,可以有一個(gè)Factory,
pub·ic c·ass FactoryRed imp·ements Factory{Co·or create(){return new Red();}}pub·ic c·ass FactoryB·ue imp·ements Factory{Co·or create(){return new B·ue();}}
這樣帶來(lái)的好處是,每當(dāng)需要引入新的Co·or實(shí)現(xiàn)時(shí),只需要新增一個(gè)類來(lái)實(shí)現(xiàn)Factory接口就可以,而不用再往Co·orFactory里塞代碼,
使用者的代碼會(huì)變成這樣,
Factory factory=new FactoryRed();Co·or co·or=factory.create();co·or.paint();
相對(duì)于簡(jiǎn)單版的Factory Method,雖然多了一行代碼,但是靈活性不變,
即使需要修改co·or實(shí)例的具體實(shí)現(xiàn),也只需要修改FactoryRed成你需要的類就行。
總結(jié)
Factory Method是開(kāi)發(fā)的利器,
它可以很好的隔離使用者和生產(chǎn)者的邏輯,從而讓使用者能靈活的使用,也只需要關(guān)心對(duì)象能使用的操作,而不需要關(guān)心對(duì)象的生產(chǎn)過(guò)程。
當(dāng)你的代碼規(guī)模變到足夠大時(shí),就需要考慮將Factory進(jìn)一步解耦,用不同的Factory去生產(chǎn)對(duì)應(yīng)的實(shí)例。
如果是在一個(gè)團(tuán)隊(duì)里開(kāi)發(fā)的話,甚至可以通過(guò)這種方式把各個(gè)具體的Factory分散到不同的小組去讓大家各自實(shí)現(xiàn)。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java設(shè)計(jì)模式之工廠模式”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743