通過聯絡實際,我們利用乙個學雷鋒做好事的例子,來體會工廠方法模式和簡單工廠的區別與聯絡。
1、寫乙個雷鋒類,學生繼承於雷鋒,通過例項化多個物件去完成洗衣、打掃等方法。
2、但是學生都是短期的,如若我們需要增加乙個長時間為老人服務的團體——社群志願者類,同樣繼承於雷鋒。再寫出簡單工廠類,運用多型,需要社群志願者或學生時,客戶端直接寫出需要的指令,例項化不同的類(學生、志願者兩個類)。
**如下:
//雷鋒類
class leifeng
public void clean()
}//學雷鋒的大學生,替雷鋒做以上工作。
class undergraduate:leifeng
//長期的幫助老人的組織:社群志願者
class volunteer : leifeng
//簡單工廠:
class ******factory
return result;}}
客戶端**:
//簡單工廠模式:
leifeng z =******factory.createleifeng("學雷鋒的大學生");
z.clean();
leifeng w =******factory.createleifeng("社群志願者");
w.wash();
//每例項化乙個物件,就需要重複一次簡單工廠的**
問題出現了:
(1)、如果需要例項化多個物件,那麼均需要不斷增加、重複些例項化**。
(2)、如果還需要增加乙個類,為老人提供別的服務時,則又需要修改再寫。
以上均違背了ocp原則(對擴充套件開放,對修改關閉)。由此引入工廠方法模式。
3、工廠模式,由於學生、社群志願者均擁有相同的方法幫助老人,故寫乙個介面(雷鋒工廠)。再寫出學生、志願者工廠,客戶端便可直接需要學生或者志願者時,直接將例項化工廠類換成相應的工廠即可。不需要重複寫繼承實現的**。
**如下:
//工廠方法模式
inte***ce ifactory
//學雷鋒的大學生工廠:
class undergraduatefactory:ifactory
}//志願者工廠:
class voluntee***ctory : ifactory
}
客戶端**:
ifactory factory = new undergraduatefactory();
leifeng l=factory .createleifeng();
l.wash();
l.clean();
ifactory fatory = newvoluntee***ctory();
leifeng v =factory.createleifeng();
v.clean();
以上三種方式執行結果均如下:
由此看出,工廠方法模式就是簡單工廠的進一步公升級,保持了簡單工廠優點的同時,克服了其每增加乙個功能就需要多寫乙個相應工廠類,違背ocp的缺點。
分享:
1、雖然通過直接寫類繼承、簡單工廠、工廠方法這三種方式編寫出來執行均能達到相同的顯示結果,但是就設計思路的精密程度和**的擴充套件性、維護性、靈活性而言,三者卻不盡相同。橫向一比較,便再一次明顯的提醒我們:設計的最終目的不僅僅只是實現功能。
2、對於設計模式的學習,動手實踐很重要。對理論闡述很容易感覺模糊。此時,一定要通過實踐,敲例子來幫助加深理解。
希望以上內容,對您有所幫助。不足之處,請多多指教。
簡單工廠模式VS工廠方法模式
這兩天在看 大話設計模式 這本書很有意思,容易讓人理解,但是看久了,設計模式種類看多了,也會容易混,容易記不清楚,所以我們應該過一段時間停下腳步,總結一下。幫助我們理解,記憶。常常駐足進行總結,顆粒歸倉才是我們的收穫。最近看到了簡單工廠模式和工廠方法模式,從名字上看這麼的相似,越相似月不容易找到他們...
簡單工廠模式VS工廠方法模式
前面學習了簡單工廠模式,理解的不是很深刻,今天剛好看到了工廠方法模式,比較一下也加深對前面的理解。首先無論是簡單工廠模式還是工廠方法模式都是把不變的地方提取出來,把容易發生變化的封裝起來。以達到做大程度的復用,和適應使用者的變動,以及專案的擴充套件。又稱為靜態工廠模式,它專門定義乙個類來負責建立其他...
工廠方法模式 VS 簡單工廠模式
這片部落格我將以乙個計算器的例子跟大家分享一下我對簡單工廠模式和工廠方法模式的理解。計算器中的基本運算有 加 減 乘 除四個。首先定義乙個運算類,類中有numa和numb這兩個需要運算的變數,有乙個getresult方法用於獲取運算結果。public class operation 其次,定義加 減...