設(shè)計(jì)模式-工廠模式

設(shè)計(jì)模式1

設(shè)計(jì)模式2

工廠模式

工廠模式可簡單的分為三類:簡單工廠,工廠方法,抽象工廠

簡單工廠模式

定義

簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式潜必,但不屬于23種GOF設(shè)計(jì)模式之一。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例沃但。簡單工廠模式是工廠模式家族中最簡單實(shí)用的模式磁滚,可以理解為是不同工廠模式的一個特殊實(shí)現(xiàn)

角色
  • 工廠類角色:這是本模式的核心,含有一定的商業(yè)邏輯和判斷邏輯,根據(jù)邏輯不同垂攘,產(chǎn)生具體的工廠產(chǎn)品

  • 抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類或者實(shí)現(xiàn)的接口维雇。由接口或者抽象類來實(shí)現(xiàn)

  • 具體產(chǎn)品角色:工廠類所創(chuàng)建的對象就是此角色的實(shí)例。在oc中由一個具體類實(shí)現(xiàn)

應(yīng)用場景
  • 編譯時無法確定預(yù)期要創(chuàng)建的對象類

  • 類想讓子類決定運(yùn)行時創(chuàng)建什么

  • 類有若干的輔助子類晒他,而你想將返回那個子類這一信息局部化

簡化理解

簡單工廠模式:專門定義一個類來創(chuàng)建其他類的實(shí)例吱型,被創(chuàng)建的實(shí)例常常具有共同的父類,實(shí)際上就是由一個工廠類陨仅,根據(jù)傳入的參數(shù)津滞,動態(tài)的決定創(chuàng)建哪個產(chǎn)品的實(shí)例

優(yōu)缺點(diǎn)
  • 優(yōu)點(diǎn):客戶端調(diào)用簡單明了,不需要關(guān)注太多的邏輯

  • 缺點(diǎn):也正是所謂的優(yōu)點(diǎn)灼伤,導(dǎo)致了工廠類中揉雜了太多的業(yè)務(wù)邏輯触徐,工廠類卻違反了開閉原則,因?yàn)槊吭黾右粋€產(chǎn)品狐赡,工廠類都需要進(jìn)行邏輯修改和判斷撞鹉,導(dǎo)致耦合度太高

工廠方法

定義

定義創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類颖侄。工廠方法使得一個類的實(shí)例化延遲到其子類鸟雏。

上面提過了簡單工廠模式中的工廠類揉雜了太多了業(yè)務(wù)邏輯,耦合度太高了发皿,比如又新增了一種具體產(chǎn)品角色崔慧,那么我們還需要在工廠類里增加判斷,然后在根據(jù)判斷去創(chuàng)建新增加的具體產(chǎn)品角色

角色
  • 抽象工廠:(iOS是接口(協(xié)議)穴墅,java是抽象類)惶室,工廠標(biāo)準(zhǔn)
  • 具體工廠:遵守工廠標(biāo)準(zhǔn)
  • 抽象產(chǎn)品:(接口(協(xié)議),抽象類)
  • 具體產(chǎn)品
image.png
簡單理解

抽象產(chǎn)品角色(可以是接口(協(xié)議中的接口)或者抽象類)定義里工廠方法創(chuàng)建的對象的接口和產(chǎn)品的共性玄货,
在工廠方法中皇钞,核心的工廠類角色不再去負(fù)責(zé)創(chuàng)建具體產(chǎn)品,而是由它的子類去做松捉,這個工廠類角色夹界,僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不接觸哪一個產(chǎn)品類被實(shí)例化這種細(xì)節(jié)

與直接創(chuàng)建新的具體產(chǎn)品相比隘世,工廠方法模式讓客戶程序可以要求由工廠方法創(chuàng)建的對象擁有一組共同的行為可柿。這樣往類層次結(jié)構(gòu)中引入新的具體產(chǎn)品時,并不需要修改客戶端代碼丙者,因?yàn)榉祷氐娜魏尉唧w對象的接口都跟客戶端一直在用的從前的接口相同复斥。從結(jié)構(gòu)圖也可以看到,工廠方法模式中的工廠類與產(chǎn)品類往往具有平行的等級結(jié)構(gòu)械媒,它們之間一一對應(yīng)目锭。

與簡單工廠模式的對比

在簡單工廠模式中评汰,由工廠類根據(jù)參數(shù)負(fù)責(zé)創(chuàng)建具體的產(chǎn)品;而在工廠方法模式中痢虹,工廠類只定義了一個創(chuàng)建產(chǎn)品的抽象接口被去,創(chuàng)建具體產(chǎn)品的工作由具體的工廠來實(shí)現(xiàn)。如果需要增加其他類型的圖形繪制奖唯,那么使用簡單工廠模式實(shí)現(xiàn)的話惨缆,首先需要增加一個其他圖形繪制的類,然后修改工廠類臭埋,在里面加分支語句來判斷踪央;使用工廠方法模式實(shí)現(xiàn)的話,不僅需要增加圖形繪制類瓢阴,還需要增加具體工廠類畅蹂。看到這里荣恐,可能大家會感覺到液斜,工廠方法模式不但沒有減少難度,反而增加了一些類和復(fù)雜度叠穆。這樣來看少漆,是不是沒有必要使用工廠方法模式?咱們再回顧一下開篇介紹的六大設(shè)計(jì)原則硼被,有一個原則是開放-關(guān)閉原則示损,簡單工廠模式不僅對擴(kuò)展開放,而且對修改也開放嚷硫,開放-關(guān)閉原則检访。工廠方法模式是簡單工廠模式的進(jìn)一步抽象,它保持了簡單工廠模式的優(yōu)點(diǎn)(去除了客戶端與具體產(chǎn)品的依賴)仔掸,而且克服了它的缺點(diǎn)開放-關(guān)閉原則脆贵。它的缺點(diǎn)是每增加一個產(chǎn)品,就需要加一個產(chǎn)品工廠的類起暮,增加了額外的開發(fā)工作量

抽象工廠模式

定義

在前面兩章中卖氨,分別介紹了簡單工廠模式和工廠方法模式,我們知道簡單工廠模式的優(yōu)點(diǎn)是去除了客戶端與具體產(chǎn)品的依賴负懦,缺點(diǎn)是違反了開放-關(guān)閉原則筒捺;工廠方法模式克服了簡單工廠模式的缺點(diǎn),將產(chǎn)品的創(chuàng)建工作放到具體的工廠類纸厉,每個工廠類負(fù)責(zé)生成一個產(chǎn)品焙矛。但是在實(shí)際應(yīng)用中,一個工廠類只創(chuàng)建單個產(chǎn)品的情況很少残腌,一般一個工廠類會負(fù)責(zé)創(chuàng)建一系列相關(guān)的產(chǎn)品,如果我們要設(shè)計(jì)這樣的系統(tǒng),工廠方法模式顯然不能滿足應(yīng)用的需求抛猫,本章要介紹的抽象工廠模式蟆盹,可以很好地解決一系列產(chǎn)品創(chuàng)建的問題

簡單理解

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

我覺得跟工廠模式一樣闺金,只是不止一個抽象產(chǎn)品的而已

先對的幾個角色進(jìn)行說明:

  • AbstractFactory:抽象工廠接口逾滥,里面應(yīng)該包含所有產(chǎn)品創(chuàng)建的抽象方法;
  • ConcreteFactory1和ConcreteFactory2:具體的工廠败匹,創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對象寨昙;
  • AbstractProductA和AbstractProductB:抽象產(chǎn)品个曙,它們可能有多種不同的實(shí)現(xiàn)方式吼砂;
  • ProductA1、ProductA2铺峭、ProductB1和ProductB2:具體的產(chǎn)品槽棍,是抽象產(chǎn)品的具體實(shí)現(xiàn)捉蚤。

從結(jié)構(gòu)圖中可以看到,抽象工廠方法最大的好處是能夠很方便的變換產(chǎn)品系列(例如id<AbstractFactory> factory =[ [ConcreteFactory1 alloc] init]炼七,只需要將ConcreteFactory1換成ConcreteFactory2缆巧,就可以創(chuàng)建ProductA2和ProductB2)。另外豌拙,抽象工廠方法讓具體的創(chuàng)建實(shí)例過程與客戶端分離陕悬,客戶端是通過它們的抽象接口操作實(shí)例,產(chǎn)品的具體類名也被具體工廠的實(shí)現(xiàn)分離按傅,不會出現(xiàn)在客戶代碼中(例如id<AbstractProductA> product = [factory createProductA]捉超,客戶端根本不知道具體的類名是ProductA1還是ProductA2)。

但是逞敷,抽象工廠方法也是存在缺點(diǎn)的狂秦,比如說現(xiàn)在我們要增加一個新的產(chǎn)品,首先推捐,我們需要增加三個類:AbstractProductC裂问、ProductC1、ProductC2牛柒;另外堪簿,我們還需要更改三個類:AbstractFactory、ConcreteFactory1皮壁、ConcreteFactory2椭更,這樣,很明顯是違背開放-關(guān)閉原則蛾魄。這也是可以理解的虑瀑,沒有任何一個設(shè)計(jì)模式是完美沒有瑕疵的湿滓,這就好比世界上沒有打不敗的武功一樣。我們可以做的就是在實(shí)際的需求中舌狗,盡可能的將變化點(diǎn)進(jìn)行隔離叽奥,以達(dá)到變化發(fā)生的時候,對整個系統(tǒng)的影響最小痛侍,變化所帶來的變更和成本最低

``

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朝氓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子主届,更是在濱河造成了極大的恐慌赵哲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件君丁,死亡現(xiàn)場離奇詭異枫夺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谈截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門筷屡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人簸喂,你說我怎么就攤上這事毙死。” “怎么了喻鳄?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵扼倘,是天一觀的道長。 經(jīng)常有香客問我除呵,道長再菊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任颜曾,我火速辦了婚禮纠拔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泛豪。我一直安慰自己稠诲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布诡曙。 她就那樣靜靜地躺著臀叙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪价卤。 梳的紋絲不亂的頭發(fā)上劝萤,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音慎璧,去河邊找鬼床嫌。 笑死跨释,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厌处。 我是一名探鬼主播煤傍,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘱蛋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起五续,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤洒敏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疙驾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凶伙,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年它碎,在試婚紗的時候發(fā)現(xiàn)自己被綠了函荣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡扳肛,死狀恐怖傻挂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挖息,我是刑警寧澤金拒,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站套腹,受9級特大地震影響绪抛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜电禀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一幢码、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尖飞,春花似錦症副、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腋么,卻和暖如春咕娄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珊擂。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工圣勒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费变,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓圣贸,卻偏偏與公主長得像挚歧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吁峻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時需要注意以下幾點(diǎn):a) 高內(nèi)聚滑负、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,736評論 0 14
  • 一用含、工廠模式簡介 意圖定義一個創(chuàng)建對象的接口矮慕,讓其子類自己決定實(shí)例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)...
    怡紅快綠閱讀 596評論 0 0
  • 設(shè)計(jì)模式——工廠模式 工廠模式核心是封裝對象的創(chuàng)建接口啄骇,將new對象的操作封裝起來痴鳄,方便創(chuàng)建使用、管理對象缸夹。 工廠...
    Ant_way閱讀 538評論 0 0
  • 前言:圖片瀏覽器大家應(yīng)該都用過痪寻,這方面的第三方也有很多,不過有時候第三方會跟我們的需求有一些出入虽惭,這就需要我們要么...
    it_hao528閱讀 1,007評論 0 4
  • 第二課作業(yè)橡类,改善RIA I便簽 人的感覺很敏銳,但是感受自己所感受的卻非常單調(diào)趟妥。認(rèn)為感受不重要猫态,更重要的是所謂"正...
    67984f731c4b閱讀 158評論 0 0