1. 程式人生 > 其它 >Java設計模式之工廠模式

Java設計模式之工廠模式

工廠模式作為設計模式的一種在開發中被普遍使用,

其實應該可以說是最經常使用的一種的了。

它的設計思想也是面向介面,如果細分下來,可以分成兩種工廠模式

·工廠方法-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分散到不同的小組去讓大家各自實現。