本次主要對比java設(shè)計(jì)模式中的簡單工廠洽腺、工廠方法嗦嗡、抽象工廠三種設(shè)計(jì)模式
在設(shè)計(jì)模式中簡單工廠和工廠方法是同一種模式
本文不貼代碼了胆剧,網(wǎng)上有很多帖子帶有代碼旱物,大家可以相互印證一下遥缕。
下面說一下這三種模式是如何層層遞進(jìn)的。
1.簡單工廠:
我們在創(chuàng)建對象一般采用new的方式宵呛,給開發(fā)帶來很多不便单匣,尤其是一些常用的工具類。所以簡單工廠就出現(xiàn)了。
簡單工廠實(shí)現(xiàn)了一個(gè)工廠類户秤,工廠類里面實(shí)現(xiàn)了你需要的具體類的構(gòu)造码秉。在客戶端調(diào)用時(shí),只需要傳入關(guān)鍵字鸡号,工廠類會(huì)自動(dòng)創(chuàng)建對象转砖。工廠類也被稱為上帝類。
缺點(diǎn):我們需要引入新的類時(shí)鲸伴,就需要對工廠類進(jìn)行修改府蔗,這不符合設(shè)計(jì)模式的開閉原則(對拓展開放,對修改關(guān)閉)汞窗,其次姓赤,當(dāng)大量的類交給工廠類時(shí),會(huì)有大量的判斷語句杉辙。增加復(fù)雜度模捂、運(yùn)維難度。
2.工廠方法:
為解決簡單工廠的缺點(diǎn)蜘矢,我們需要橫向拓展工廠類狂男,將每個(gè)需要工廠來創(chuàng)建的類都創(chuàng)建一個(gè)工廠類,每個(gè)工廠類都對應(yīng)一個(gè)具體類的實(shí)現(xiàn)品腹,同時(shí)需要?jiǎng)?chuàng)建工廠類的接口和抽象類的接口岖食。調(diào)用方需要?jiǎng)?chuàng)建某個(gè)類時(shí),需要調(diào)用工廠接口對應(yīng)的工廠類的具體實(shí)現(xiàn)舞吭,然后根據(jù)實(shí)現(xiàn)的工廠類創(chuàng)建對象泡垃。
這里給我最大的感受就是簡單工廠只有一個(gè)工廠類(是真的累),所有創(chuàng)建對象的類都要在這里實(shí)現(xiàn)羡鸥,工廠方法只是在這個(gè)工廠類上進(jìn)行了橫向拓展蔑穴。這樣在我們有要新增的類加入時(shí),只需要?jiǎng)?chuàng)建一個(gè)工廠類實(shí)現(xiàn)工廠接口惧浴,創(chuàng)建一個(gè)具體產(chǎn)品類存和,實(shí)現(xiàn)產(chǎn)品接口就可以了,這樣就保證了設(shè)計(jì)模式的開閉原則衷旅。
3.抽象工廠:
其實(shí)工廠方法已經(jīng)可以解決大部分也無需求捐腿,但是但我們需要?jiǎng)?chuàng)建的產(chǎn)品類復(fù)雜到一定程度的時(shí)候,就需要抽象工廠來處理了柿顶。
比如:牛茄袖、羊?qū)儆趧?dòng)物,有兩個(gè)牧場里面都有牛嘁锯、羊宪祥。
兩個(gè)農(nóng)場里面的所有牛是一個(gè)產(chǎn)品族聂薪,動(dòng)物是產(chǎn)品樹(因?yàn)槭呛芏囝惖目傤悾?/p>
這時(shí)我們需要分別創(chuàng)建動(dòng)物,然后創(chuàng)建牛蝗羊、羊的類來實(shí)現(xiàn)接口胆建。然后創(chuàng)建工廠類分別有創(chuàng)建牛、羊的抽象方法肘交。然后兩個(gè)牧場分別實(shí)現(xiàn)工廠類的接口,重寫牛羊的抽象方法扑馁。創(chuàng)建調(diào)用時(shí)涯呻,只需要?jiǎng)?chuàng)建對應(yīng)的農(nóng)場類,然后調(diào)用創(chuàng)建牛羊的方法腻要,就能準(zhǔn)確定位需要?jiǎng)?chuàng)建的是哪個(gè)農(nóng)場的鸥垂蓿或者羊。
個(gè)人理解:其實(shí)從工廠方法到抽象工廠雄家,區(qū)別只在于是否將產(chǎn)品再抽象出來一層效诅,這樣就形成矩陣式的,既有樹又有族趟济。(在工廠方法中只有樹)乱投。其實(shí)如果我們不去抽象動(dòng)物這一層級,完全可以向工廠方法一樣顷编,牧場a的牛戚炫、牧場b的牛。媳纬。双肤。然后分別創(chuàng)建牧場a牛的工廠。钮惠。茅糜。
本文參考:https://blog.csdn.net/xiao1_1bing/article/details/81774931