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