設(shè)計(jì)模式二【GeekBand】

ABSTRACT FACTORY(抽象工廠)—對象創(chuàng)建型模

意圖

提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類.

適用性

在以下情況可以使用AbstractFactory模式
?一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)撬即。
?一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)犁柜。
?當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
?當(dāng)你提供一個(gè)產(chǎn)品類庫裳食,而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)或衡。

結(jié)構(gòu)

image.png

效果

AbstractFactory模式有下面的一些優(yōu)點(diǎn)和缺點(diǎn):
1)它分離了具體的類。AbstractFactory模式幫助你控制一個(gè)應(yīng)用創(chuàng)建的對象的類宣增。因?yàn)?br> 一個(gè)工廠封裝創(chuàng)建產(chǎn)品對象的責(zé)任和過程玫膀,它將客戶與類的實(shí)現(xiàn)分離〉ⅲ客戶通過它們的抽象接口操縱實(shí)例帖旨。產(chǎn)品的類名也在具體工廠的實(shí)現(xiàn)中被分離;它們不出現(xiàn)在客戶代碼中灵妨。
2)它使得易于交換產(chǎn)品系列一個(gè)具體工廠類在一個(gè)應(yīng)用中僅出現(xiàn)一次—即在它初始化
的時(shí)候解阅。這使得改變一個(gè)應(yīng)用的具體工廠變得很容易。它只需改變具體的工廠即可使用不同的產(chǎn)品配置泌霍,這是因?yàn)橐粋€(gè)抽象工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列货抄,所以整個(gè)產(chǎn)品系列會(huì)立刻改變。在我們的用戶界面的例子中朱转,我們僅需轉(zhuǎn)換到相應(yīng)的工廠對象并重新創(chuàng)建接口蟹地,就可實(shí)現(xiàn)從Motif窗口組件轉(zhuǎn)換為PresentationManager窗口組件。
3)它有利于產(chǎn)品的一致性當(dāng)一個(gè)系列中的產(chǎn)品對象被設(shè)計(jì)成一起工作時(shí)藤为,一個(gè)應(yīng)用一
次只能使用同一個(gè)系列中的對象怪与,這一點(diǎn)很重要。而AbstractFactory很容易實(shí)現(xiàn)這一點(diǎn)缅疟。
4)難以支持新種類的產(chǎn)品難以擴(kuò)展抽象工廠以生產(chǎn)新種類的產(chǎn)品琼梆。這是因?yàn)?br> AbstractFactory接口確定了可以被創(chuàng)建的產(chǎn)品集合。支持新種類的產(chǎn)品就需要擴(kuò)展該工廠接口窿吩,這將涉及AbstractFactory類及其所有子類的改變茎杂。我們會(huì)在實(shí)現(xiàn)一節(jié)討論這個(gè)問題的一個(gè)解決辦法。

BUILDER(生成器)—對象創(chuàng)建型模式

將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離纫雁,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示煌往。

適用性

在以下情況使用Builder模式
?當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí)。
?當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時(shí)轧邪。

結(jié)構(gòu)

image.png

效果

這里是Builder模式的主要效果:
1)它使你可以改變一個(gè)產(chǎn)品的內(nèi)部表示Builder對象提供給導(dǎo)向器一個(gè)構(gòu)造產(chǎn)品的抽象接口刽脖。該接口使得生成器可以隱藏這個(gè)產(chǎn)品的表示和內(nèi)部結(jié)構(gòu)。它同時(shí)也隱藏了該產(chǎn)品是如何裝配的忌愚。因?yàn)楫a(chǎn)品是通過抽象接口構(gòu)造的曲管,你在改變該產(chǎn)品的內(nèi)部表示時(shí)所要做的只是定
義一個(gè)新的生成器。
2)它將構(gòu)造代碼和表示代碼分開Builder模式通過封裝一個(gè)復(fù)雜對象的創(chuàng)建和表示方式
提高了對象的模塊性硕糊≡核客戶不需要知道定義產(chǎn)品內(nèi)部結(jié)構(gòu)的類的所有信息腊徙;這些類是不出現(xiàn)在Builder接口中的。每個(gè)ConcreteBuilder包含了創(chuàng)建和裝配一個(gè)特定產(chǎn)品的所有代碼檬某。這些代碼只需要寫一次撬腾;然后不同的Director可以復(fù)用它以在相同部件集合的基礎(chǔ)上構(gòu)作不同的Product。
3)它使你可對構(gòu)造過程進(jìn)行更精細(xì)的控制Builder模式與一下子就生成產(chǎn)品的創(chuàng)建型模
式不同恢恼,它是在導(dǎo)向者的控制下一步一步構(gòu)造產(chǎn)品的民傻。僅當(dāng)該產(chǎn)品完成時(shí)導(dǎo)向者才從生成器中取回它。因此Builder接口相比其他創(chuàng)建型模式能更好的反映產(chǎn)品的構(gòu)造過程场斑。這使你可以更精細(xì)的控制構(gòu)建過程漓踢,從而能更精細(xì)的控制所得產(chǎn)品的內(nèi)部結(jié)構(gòu)。

FACTORY METHOD(工廠方法)—對象創(chuàng)建型模式

定義一個(gè)用于創(chuàng)建對象的接口漏隐,讓子類決定實(shí)例化哪一個(gè)類彭雾。FactoryMethod使一個(gè)類的實(shí)例化延遲到其子類。

適用性

在下列情況下可以使用FactoryMethod模式:
?當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類的時(shí)候锁保。
?當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象的時(shí)候。
?當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè)半沽,并且你希望將哪一個(gè)幫助子類
是代理者這一信息局部化的時(shí)候爽柒。

結(jié)構(gòu)

image.png

效果

工廠方法不再將與特定應(yīng)用有關(guān)的類綁定到你的代碼中。代碼僅處理Product接口者填;因此
它可以與用戶定義的任何ConcreteProduct類一起使用浩村。
工廠方法的一個(gè)潛在缺點(diǎn)在于客戶可能僅僅為了創(chuàng)建一個(gè)特定的ConcreteProduct對象,
就不得不創(chuàng)建Creator的子類占哟。當(dāng)Creator子類不必需時(shí)心墅,客戶現(xiàn)在必然要處理類演化的其他方面;但是當(dāng)客戶無論如何必須創(chuàng)建Creator的子類時(shí)榨乎,創(chuàng)建子類也是可行的怎燥。
下面是FactoryMethod模式的另外兩種效果:
1)為子類提供掛鉤(hook)用工廠方法在一個(gè)類的內(nèi)部創(chuàng)建對象通常比直接創(chuàng)建對象
更靈活。FactoryMethod給子類一個(gè)掛鉤以提供對象的擴(kuò)展版本蜜暑。
2)連接平行的類層次迄今為止铐姚,在我們所考慮的例子中,工廠方法并不往往只是被
Creator調(diào)用肛捍,客戶可以找到一些有用的工廠方法隐绵,尤其在平行類層次的情況下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拙毫,一起剝皮案震驚了整個(gè)濱河市依许,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缀蹄,老刑警劉巖峭跳,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘婶,死亡現(xiàn)場離奇詭異,居然都是意外死亡坦康,警方通過查閱死者的電腦和手機(jī)竣付,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滞欠,“玉大人古胆,你說我怎么就攤上這事∩歌担” “怎么了逸绎?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夭谤。 經(jīng)常有香客問我棺牧,道長,這世上最難降的妖魔是什么朗儒? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任颊乘,我火速辦了婚禮,結(jié)果婚禮上醉锄,老公的妹妹穿的比我還像新娘乏悄。我一直安慰自己,他們只是感情好恳不,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布檩小。 她就那樣靜靜地躺著,像睡著了一般烟勋。 火紅的嫁衣襯著肌膚如雪规求。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天卵惦,我揣著相機(jī)與錄音阻肿,去河邊找鬼。 笑死沮尿,一個(gè)胖子當(dāng)著我的面吹牛冕茅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛹找,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼姨伤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庸疾?” 一聲冷哼從身側(cè)響起乍楚,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎届慈,沒想到半個(gè)月后徒溪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿偷,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年臊泌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲤桥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠概,死狀恐怖茶凳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情播揪,我是刑警寧澤贮喧,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站猪狈,受9級特大地震影響箱沦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雇庙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一谓形、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疆前,春花似錦寒跳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匈挖。三九已至碾牌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儡循,已是汗流浹背舶吗。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留择膝,地道東北人誓琼。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像肴捉,于是被迫代替她去往敵國和親腹侣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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

  • 設(shè)計(jì)模式匯總 一齿穗、基礎(chǔ)知識 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用傲隶、多...
    MinoyJet閱讀 3,903評論 1 15
  • “對象創(chuàng)建”模式通過“對象創(chuàng)建”模式繞開new,來避免對象創(chuàng)建(new)過程中所導(dǎo)致的緊耦合(依賴具體類)窃页,從而支...
    CharlesW閱讀 219評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法跺株,類相關(guān)的語法复濒,內(nèi)部類的語法,繼承相關(guān)的語法乒省,異常的語法巧颈,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 一、設(shè)計(jì)模式的分類 總體來說設(shè)計(jì)模式分為三大類: 創(chuàng)建型模式袖扛,共五種:工廠方法模式砸泛、抽象工廠模式、單例模式攻锰、建造者...
    RamboLI閱讀 744評論 0 1
  • 1 場景問題# 1.1 繼續(xù)導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 在討論工廠方法模式的時(shí)候晾嘶,提到了一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架。 對于...
    七寸知架構(gòu)閱讀 5,667評論 1 64