引言
工廠模式主要是為創(chuàng)建對象提供了接口勾栗。工廠模式按照《Java與模式》中的提法分為三類:
1. 簡單工廠模式(Simple Factory)
2. 工廠方法模式(Factory Method)
3. 抽象工廠模式(Abstract Factory)
這三種方法從上到下逐步具有抽象性渊抄,還有一種分類方法铸磅,將簡單工廠看做工廠方法的一種特例,分為一類哗魂。本片文章主要講解簡單工廠模式和工廠方法模式印荔,抽象工廠模式請參考下一章恶复。文章屬個人見解,如有不對還望大佬們指正殿雪。
一暇咆、簡單工廠模式
舉個小栗子:某客戶去某工廠買轎車,客戶說買寶馬丙曙,則希望得到一輛寶馬爸业,客戶說買奔馳,則希望得到一輛奔馳河泳,客戶說買……在這個過程中沃呢,客戶并不關(guān)心車如何制造的過程,這就可以用簡單工廠模式來實現(xiàn)拆挥。
在上面的栗子中薄霜,可以劃分三種角色:
1、工廠類角色:栗子中的工廠纸兔,也是本模式的核心模塊惰瓜,通過不同的輸入,生產(chǎn)制造出不同的車汉矿;
2崎坊、抽象產(chǎn)品角色:不同的車都可以抽象為車的概念,由接口或者抽象類來體現(xiàn)洲拇;
3奈揍、具體產(chǎn)品角色:即栗子中的寶馬車曲尸、奔馳車等具體產(chǎn)品,通過實現(xiàn)或繼承抽象產(chǎn)品來實現(xiàn)男翰;
用類圖來表示他們之間的關(guān)系:
圖中接口Car表示抽象產(chǎn)品角色另患,具有一般性;BwmCar類蛾绎、BenzCar類等為具體產(chǎn)品角色昆箕;CarFactory為工廠類角色,主要生產(chǎn)不同的汽車租冠;FactoryDemo可以理解為“客戶”鹏倘。
實現(xiàn)代碼如下
1编丘、先創(chuàng)建抽象產(chǎn)品類
2旋圆、創(chuàng)建具體產(chǎn)品類
3、創(chuàng)建工廠類
4笔呀、“客戶”買車
5话原、測試結(jié)果
通過上面的小栗子夕吻,希望大家能對簡單工廠模式有一定的了解,簡單工廠模式一般適用于小項目或者具體產(chǎn)品很少擴(kuò)展的情況繁仁。
優(yōu)點:能很好的將對象的使用和創(chuàng)建分開涉馅,使用者并不關(guān)心對象的創(chuàng)建,達(dá)到了相對解耦的目的黄虱;
缺點:可擴(kuò)展性較差稚矿,假如增加新的產(chǎn)品類,則需要修改核心類代碼(即工廠類)捻浦,這樣違背了開閉原則(請參考上篇文章)晤揣。針對這點,工廠方法模式能很好的解決朱灿。
二昧识、工廠方法模式
還舉上面的例子,假設(shè)增加了新的品牌車(如大眾)盗扒,核心工廠需要改造跪楞,每次增加新品牌,都需要改造侣灶,會把核心工廠“累壞的”甸祭。換一個新的思路,將工廠抽象出來褥影,抽象方法為造車池户,至于具體造車由實現(xiàn)類或者繼承類去實現(xiàn),這樣的話,某客戶要買寶馬車校焦,就可以去寶馬車工廠買赊抖,某客戶要買奔馳車,則可以去奔馳車購買……這樣在新增車品牌時寨典,只需要擴(kuò)展工廠實現(xiàn)類即可熏迹,完美的解決了簡單工廠模式解決不了的開閉原則。
在工廠方法模式中有四種角色:
抽象工廠類角色:這是工廠方法模式的核心凝赛,是具體的工廠類角色必須實現(xiàn)或繼承的父類,將工廠抽象化坛缕;
具體工廠類角色:上面例子中的寶馬車工廠墓猎、奔馳車工廠,用創(chuàng)建對應(yīng)的具體產(chǎn)品赚楚;
抽象產(chǎn)品類角色:不同的車都可以抽象為車的概念毙沾,由接口或者抽象類來體現(xiàn);
具體產(chǎn)品角色:即栗子中的寶馬車宠页、奔馳車等具體產(chǎn)品左胞,通過實現(xiàn)或繼承抽象產(chǎn)品來實現(xiàn);
用類圖表示如下:
由上圖可以看出举户,具體的車不再由核心工廠創(chuàng)建烤宙,而由不同的工廠創(chuàng)建。
實現(xiàn)代碼如下:
1俭嘁、先創(chuàng)建抽象產(chǎn)品類
2躺枕、創(chuàng)建具體產(chǎn)品類
3、創(chuàng)建抽象工廠類
4供填、創(chuàng)建具體工廠類
4拐云、“客戶”買車類
測試結(jié)果:
使用開閉原則來分析下工廠方法模式。即當(dāng)有新產(chǎn)品時近她,只要繼承或?qū)崿F(xiàn)抽象產(chǎn)品類叉瘩;新建具體工廠繼承或?qū)崿F(xiàn)抽象工廠而不用修改任何一個類)工廠方法模式是完全符合開閉原則的!