小白的設(shè)計(jì)模式之旅(工廠模式之抽象工廠)

前面我們學(xué)習(xí)了工廠模式和工廠方法模式桅锄,下面做一個(gè)簡(jiǎn)單的回顧:

簡(jiǎn)單工廠模式:是為了將具體類的實(shí)例化和這個(gè)類對(duì)象的應(yīng)用分離出來琉雳,

工廠方法模式:是為了讓簡(jiǎn)單工廠方法滿足”對(duì)擴(kuò)展開放样眠,對(duì)修改關(guān)閉”,將對(duì)象的創(chuàng)建推遲到子類中

下面我們要學(xué)習(xí)的就是工廠模式家族中最后一個(gè)設(shè)計(jì)模式抽象工廠模式翠肘。抽象工廠模式提供了一個(gè)創(chuàng)建一系列相關(guān)對(duì)象或者一系列相互依賴對(duì)象的接口檐束。抽象工廠定義了一系列的用來生產(chǎn)不同等級(jí)結(jié)構(gòu)下的同一產(chǎn)品族接口,不需要關(guān)心具體產(chǎn)品是什么束倍,這樣一來將客戶從具體的產(chǎn)品中解耦出來被丧。

1:什么是抽象工廠模式


定義:提供了一個(gè)接口,用于創(chuàng)建相關(guān)的或相互依賴的一組對(duì)象家族

類圖:

抽象工廠接口(IFactory):定義了一組方法绪妹,每個(gè)方法都用來創(chuàng)建一個(gè)具體產(chǎn)品

具體工廠(Factory):實(shí)現(xiàn)了產(chǎn)品接口, 完成具體產(chǎn)品的創(chuàng)建

產(chǎn)品A/B抽象類(Abstract Product A/B):是一個(gè)抽象類,用于具體工廠來生產(chǎn)產(chǎn)品

具體產(chǎn)品A/B類(Concrete Product A/B):具體工廠生產(chǎn)出來的產(chǎn)品

業(yè)務(wù)場(chǎng)景:

? ? 繼續(xù)我門的月餅加盟店案例甥桂,隨著我們的品牌越來越好,每個(gè)城市都出現(xiàn)了很多的線下店鋪邮旷,但同時(shí)也出現(xiàn)了一個(gè)新的問題那就是店鋪使用的原料(面粉黄选,油等)的不正規(guī)現(xiàn)象。所以為了保證我們的品質(zhì)婶肩,保證每家店鋪的原料都和安全合格有機(jī)的办陷,我不得不繼續(xù)升級(jí)我們的項(xiàng)目,來保證所有的原料都出至一家律歼,都由總部統(tǒng)一配送懂诗。

2:實(shí)現(xiàn)抽象工廠模式


分析場(chǎng)景:

? ? ? 在我們上面描述的場(chǎng)景中,每個(gè)月餅都需要面粉和油苗膝,但是不同區(qū)域使用的面粉和油不一樣。那我們的(高筋面粉植旧,中筋面粉辱揭,低筋面粉),(胡麻油病附,色拉油问窃,大豆油)就夠成了三個(gè)不同的產(chǎn)品族,同時(shí)面粉和油便認(rèn)為是我們的產(chǎn)品等級(jí)完沪。如下圖:

通過上面的分析域庇,我就可以確定我們的產(chǎn)品族和產(chǎn)品等級(jí)了,那我們的IFactory就只需要提供2個(gè)產(chǎn)品的生產(chǎn)接口覆积,我門的實(shí)體工廠ConcreteFactory需要3個(gè)來生產(chǎn)本地化的具體產(chǎn)品听皿,下面針對(duì)我們的場(chǎng)景來設(shè)計(jì)一份我們自己的類圖:

這樣一來,我們就完美的把這個(gè)場(chǎng)景映射到了抽象工廠模式中宽档,這樣一來尉姨,我們便解決了原料的安全隱患,接下來讓我們來思考一下吗冤,如何設(shè)計(jì)我們的月餅又厉,線下商鋪九府,讓他們完美協(xié)作。

首先我們需要一個(gè)線下的實(shí)體店方便我們點(diǎn)餐覆致,每個(gè)實(shí)體店都需要生產(chǎn)月餅也就意味著每個(gè)實(shí)體店都需要再維護(hù)一個(gè)原料工廠侄旬。依據(jù)我們的依賴倒置原則,抽象一個(gè)月餅類和一個(gè)月餅店的接口煌妈,類圖設(shè)計(jì)如下:

完成上面復(fù)雜的分析后剩下的工作就是用code來實(shí)現(xiàn)我們的類圖設(shè)計(jì)儡羔。

定義工廠接口,用來生產(chǎn)一組面粉和油

定義實(shí)體工廠SCFactory声旺,來生產(chǎn)低筋面粉和色拉油

定義實(shí)體工廠NMFactory笔链,來生產(chǎn)高筋面粉和胡麻油

定義實(shí)體工廠BJFactory,來生產(chǎn)中筋面粉和大豆油

定義我們面粉類產(chǎn)品

定義我們的油類產(chǎn)品

定義我們的月餅家族

月餅抽象類
肉月餅

定義我們的客戶端腮猖,實(shí)體加盟店鋪

實(shí)體店抽象類
北京加盟店
內(nèi)蒙加盟店
四川加盟店

好了鉴扫,可以下單了,走進(jìn)內(nèi)蒙地區(qū)加盟店澈缺,點(diǎn)個(gè)肉陷月餅

工程介紹:

IFactory:月餅的原料工廠接口坪创,定義生產(chǎn)一個(gè)月餅需要的相關(guān)產(chǎn)品的家族創(chuàng)建,

SCFactory,NMFactory,BJFactory:負(fù)責(zé)生產(chǎn)具體的原料姐赡,每個(gè)工廠都會(huì)生產(chǎn)符合自己的產(chǎn)品原料

Dough,HighDough,MiddleDough,LowDough:面粉的家族

Oil,FlaxOil,SoybeanOil,SaladOil:油的家族

MoonCakeSotre:線下加盟店鋪莱预,用來生產(chǎn)具體區(qū)域的月餅(如:內(nèi)蒙店鋪就只需要內(nèi)蒙的工廠來提供的面粉和油,符合當(dāng)?shù)氐目谖叮?/p>

3:抽象工廠的使用場(chǎng)景


切換數(shù)據(jù)庫(kù)或者添加新的數(shù)據(jù)庫(kù):

抽象工廠就會(huì)突顯的尤為重要项滑,例如:我們工程中有三個(gè)DAO:DAO1, DAO2, DAO3;但是在不用的數(shù)據(jù)庫(kù)(Sqlsever, my Sql, Access)中語法有些小的差異依沮,那當(dāng)我們要切換數(shù)據(jù)庫(kù)就需要把每個(gè)DAO里面的SQL都修改成相應(yīng)的語法,這樣的工程就違反了我們的“開閉原則“枪狂。讓我們使用抽象工程來解決這個(gè)問題:

1:我們創(chuàng)建一個(gè)IFacotry定義一組生成DAO層的接口

2:創(chuàng)建我門的各個(gè)產(chǎn)品類和對(duì)應(yīng)的接口(在代碼中要依賴抽象危喉,不依賴具體對(duì)象),IDAO1州疾,DAO1,? IDAO2辜限,DAO2, IDAO3, DAO3

3:創(chuàng)建三個(gè)SQL的具體工廠,(Sql Server Factroy, MySqlFactory, Access Factory)實(shí)現(xiàn)IFactory接口并返回具體的產(chǎn)品對(duì)象

如果我們需要添加/切換新的數(shù)據(jù)庫(kù)严蓖,就只需要添加新的DAO層實(shí)現(xiàn)和新的Factory并實(shí)現(xiàn)IFactory接口就ok,不需要修改任何代碼薄嫡。

4:抽象工廠的優(yōu)缺點(diǎn)


優(yōu)點(diǎn):

? ? 1):抽象工廠可以把一系列相關(guān)的產(chǎn)品集合起來,當(dāng)需要多個(gè)產(chǎn)品同時(shí)協(xié)作時(shí)可以保證所有的產(chǎn)品生產(chǎn)的一致性(比如我們的月餅需要的原料),并隔離具體產(chǎn)品的創(chuàng)建

? ? 2):當(dāng)有新產(chǎn)品族加入時(shí)颗胡,不許要修改代碼毫深,只需要添加一個(gè)具體的工廠

? ? 3):通過組合的方式創(chuàng)建對(duì)象,使用應(yīng)用程序解耦毒姨,同時(shí)降低對(duì)特定對(duì)象 的依賴

缺點(diǎn):

? ? 如果有產(chǎn)品等級(jí)加入费什,就需要修改工廠接口和所有的具體工廠

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸳址,更是在濱河造成了極大的恐慌瘩蚪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稿黍,死亡現(xiàn)場(chǎng)離奇詭異疹瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巡球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門言沐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酣栈,你說我怎么就攤上這事险胰。” “怎么了矿筝?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵起便,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我窖维,道長(zhǎng)榆综,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任铸史,我火速辦了婚禮鼻疮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琳轿。我一直安慰自己判沟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布崭篡。 她就那樣靜靜地躺著水评,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媚送。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天寇甸,我揣著相機(jī)與錄音塘偎,去河邊找鬼。 笑死拿霉,一個(gè)胖子當(dāng)著我的面吹牛吟秩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绽淘,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼涵防,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了沪铭?” 一聲冷哼從身側(cè)響起壮池,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤偏瓤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后椰憋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厅克,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年橙依,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了证舟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窗骑,死狀恐怖女责,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情创译,我是刑警寧澤抵知,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站昔榴,受9級(jí)特大地震影響辛藻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜互订,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一吱肌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仰禽,春花似錦氮墨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至温峭,卻和暖如春猛铅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凤藏。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工奸忽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揖庄。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓栗菜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蹄梢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疙筹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容