單例模式寫的太匆忙,今天寫工廠模式,順便簡單的說下UML類圖四種關系:依賴,關聯,泛化(繼承)和實作。
說說依賴與關聯的差別
依賴:
關聯:
注意箭頭,關聯更像是依賴的一種擴充。
工廠模式:
工廠模式,通常指的三個模式: 簡單工廠,抽象工廠,工廠方法 三個模式(其實我不大喜歡他們這個命名,剛開始的時候并不能把他們當做模式的名稱,尤其工廠方法)。簡單工廠模式有時候不被叫做一種設計模式(你隻需要知道,這并不重要),我們遵循主流原則,把簡單工廠當做一種設計模式,并首先介紹。
看UML圖:
這個圖中,Factory類作為工廠,專門生産實作了Per接口的所有類。 Performer作為實際實作者。下面我們來個借《Java與模式》的例子,來整體了解一下簡單工廠設計模式。
<a href="http://yjplxq.blog.51cto.com/attachment/201207/29/4081353_13435784644oQU.jpg"></a>
如果有一個農場,負責銷售各種水果,你作為一個客戶,隻需要對農場的銷售人員說:我要蘋果,農場就會給你蘋果。
轉換成軟體語言: 農場是個服務端,而他對外的接口便是銷售人員,客戶便是用戶端。 用戶端隻需要知道Fruit和 工廠類,就可以得到期望的水果,比如蘋果,而不需要知道其他蘋果或者葡萄的實作類。
水果接口
public interface Fruit{
void grow();
void harvest();
void plant();
}
蘋果實作類
/**
* 蘋果
*/
public class Apple implements Fruit{
private int treeAge;
public void grow(){
log("apple grow");
}
public void harvest(){
log("apple harvest");
public void plant(){
log("apple plant");
public void log(String msg){
System.out.println(msg);
然後還有葡萄和草莓類,我就略了。
下面我們編寫工廠類
pulibc class FruitFactory{
public static Fruit factory(String which){
if(which.equalsIgnoreCase("apple")){
return new Apple();
}else if(which.equalsIgnoreCase("strawberry")){
return new Strawberry()
}else if(which.equalsIgnoreCase("grape")){
return new Grape();
}
else {
throw new BadFrutException("Bad fruit request!")
//如果編寫的自己 的元件,試着定義自己的異常基類
}
}
看看用戶端需要做的:
FruitFactory.factory("apple");
如果不這麼做,用戶端要得到一個蘋果,那麼需要:
new Apple()
那麼再要點草莓:
new Strawberry()
好的,我是伺服器,我忽然想更新了,我覺得Apple這個名字,應該改名叫AppleRed. 于是加了一個新類,并且相容原來的版本,在伺服器并沒有一個好的設計,我不得不保留了Apple這個類。
用戶端:我因為你的更新,而要改變原來的代碼,這太可怕了。
再看看伺服器端用了工廠模式的好處
伺服器: 平滑更新,不需要釋出新的API告知客戶我做了什麼。
用戶端: 什麼都不需要做。
何時用簡單工廠模式:
如上面的例子:一般用戶端和服務端的形式的情況,或者編寫插件情況下,喜歡采用簡單工廠方法。
實際應用:
1. spring 中有用到簡單工廠模式
2. 抽象工廠模式 經常用到 簡單工廠模式
有點晚了,抽象工廠和工廠方法相對複雜,容易弄混,下篇文章再介紹。
本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/yjplxq/947267,如需轉載請自行聯系原作者