這一章講的是簡單工廠模式和工廠方法模式的比較劲阎。
????先是說袁串,小菜有個同學(xué)薛磊風(fēng)(學(xué)雷鋒),平時默默無聞倍权,一天不幸出了車禍掷豺,然后同學(xué)們就去醫(yī)院看望他,才知道他三年如一日地為一位孤寡老人做好事薄声,然后他現(xiàn)在住院了嘛当船,就拜托小菜他們替他照顧一下老人家。
????坦白講呢默辨,如果是我的話德频,我做不到這么偉大,我只想照顧好自己的家人就夠了廓奕。
????然后呢抱婉,小菜和大鳥說了這個事情,他們就開始談?wù)撛O(shè)計模式了桌粉,今天討論的是簡單工廠和工廠方法模式蒸绩。
????簡單工廠就是第一章講的那個,在工廠類中有switch來生成對應(yīng)的運算子類铃肯,而工廠方法模式呢患亿,是在抽象工廠下面又?jǐn)U展了對應(yīng)的加減乘除四個工廠,有什么區(qū)別呢?
????在簡單工廠中步藕,如果要新增運算惦界,那么就要修改工廠類,增加switch的分支咙冗,這就違背了開-閉原則沾歪,而工廠方法中,新增運算是新增對應(yīng)的運算工廠類雾消,這樣不違背開閉原則灾搏。
????簡單工廠模式最大的優(yōu)點是工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動態(tài)的實例化相關(guān)的類立润,對于客戶端來說狂窑,去除了與具體產(chǎn)品相關(guān)的依賴。比如計算器例子中桑腮,客戶端不用管該用哪個類的實例泉哈,只需要把運算符傳給工廠就行。但是不可避免的違背了開閉原則破讨,因為新增運算符勢必需要修改工廠類丛晦。
????下面來重點理解一下工廠方法模式:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個子類添忘,把一個類的實例化延遲到子類中采呐。
????工廠方法模式實現(xiàn)時,客戶端需要決定實例化哪一個工廠來實現(xiàn)運算類搁骑,選擇判斷的問題還是存在的,也就是說又固,工廠方法模式把簡單工廠的內(nèi)部判斷邏輯移到了客戶端中仲器,你想要增加功能,本來是改工廠類仰冠,現(xiàn)在是修改客戶端乏冀。
回到這一章的故事上來,用代碼來表示幫助老人這個故事:
/***
* 雷鋒抽象類
*/
public abstract class LeiFeng {
// 掃地
abstract void sweep();
// 洗衣服
abstract void wash();
// 買米
abstract void buyRice();
}
現(xiàn)在三個學(xué)生去做好事洋只,學(xué)生類Student繼承LeiFent,在客戶端中這樣調(diào)用:
public static void main(String[] args) {
LeiFeng student1 = new Student();
LeiFeng student2 = new Student();
LeiFeng student3 = new Student();
student1.sweep();
student2.wash();
student3.buyRice();
}
如果此時這三個不是學(xué)生,而是志愿者眯亦,那么就需要修改每個new Student()的地方误算,改成new Volunteer(),
如果用簡單工廠來描述担锤,就是:
switch
"學(xué)生" :
new Student();
break;
"志愿者":
new Volunteer();
break;
每個實例化學(xué)生的地方蔚晨,都要寫Factory.createLeiFeng("學(xué)生"),如果需要改成志愿者肛循,那么每個地方都要修改;
而如果用工廠方法模式來描述這個例子铭腕,就是:
先創(chuàng)建StudentFactory和VolunteerFactory兩個工廠類银择,繼承LeiFengFactory,在客戶端中:
LeiFengFactory leiFengFactory = new StudentFactory();
LeiFeng leiFeng1 = leiFengFactory.createLeiFeng();
LeiFeng leiFeng2 = leiFengFactory.createLeiFeng();
LeiFeng leiFeng3 = leiFengFactory.createLeiFeng();
leiFeng1.buyRice();
leiFeng2.sweep();
leiFeng3.wash();
這樣累舷,如果要改成志愿者做好事浩考,那么只需要修改new StudentFactory()為new VolunteerFactory(),只需要改這一個地方就行被盈。
工廠方法模式比簡單工廠要高明一點析孽,它既封裝了創(chuàng)建對象的過程,又克服了開閉原則害捕,缺點是每加一個產(chǎn)品绿淋,就要對應(yīng)增加一個工廠類。 -- “反射尝盼,可以解決這個問題吞滞。”