iOS 工廠方法和抽象工廠(一)

開篇

在這篇文章中我們講下工廠方法和抽象工廠這兩種設(shè)計(jì)模式瓶堕。幾乎在每個(gè)面向?qū)ο蟮某绦蚶锒紩?huì)看到工廠方法败砂,隨便讓一個(gè)程序員或者軟院,計(jì)科的學(xué)生說個(gè)設(shè)計(jì)模式都會(huì)說出工廠模式世落』刺冢看似普通的東西其實(shí)并不普通,今天我們就來認(rèn)真的研究下什么是工廠方法屉佳,它和抽象工廠有什么異同谷朝?抽絲剝繭,總結(jié)一套心得武花,在以后寫程序的時(shí)候更得心應(yīng)手圆凰,不會(huì)心存疑慮。

工廠方法

總的來說体箕,工廠方法是抽象工廠的組成部分专钉,各種具體工廠類重載抽象工廠類中的方法挑童,并用這些工廠方法創(chuàng)建具體產(chǎn)品。工廠方法的精髓在于: 一個(gè)類無法預(yù)期要生成那個(gè)類的對(duì)象跃须,需要其子類來指定要生成的對(duì)象炮沐。

下圖是工廠方法模式的靜態(tài)類圖(圖片來源于《編程之道》)

Factory method

Creator是一個(gè)抽象的工廠父類,定義了FactoryMethod這個(gè)需要重載的工廠方法回怜,其子類ConcreteCreator實(shí)現(xiàn)了這個(gè)方法大年,返回具體的產(chǎn)品。在1994年Wesley最初定義工廠模式的時(shí)候玉雾,他說: 工廠方法模式翔试,就是讓子類決定實(shí)例化哪個(gè)類,使得一個(gè)類的實(shí)例化延遲到其子類复旬。在平時(shí)的coding中垦缅,我們也會(huì)經(jīng)常遇到這樣的情況,例如你從網(wǎng)絡(luò)請(qǐng)求一些產(chǎn)品的列表驹碍,但是產(chǎn)品種類很多壁涎,需要運(yùn)行時(shí)才能確定,這時(shí)候就需要使用工廠方法志秃,例如[[self class] xxxFactory]來讓具體子類生成產(chǎn)品怔球。

何時(shí)使用工廠方法以及它的好處

以下情形會(huì)讓你自然而然的想到使用工廠方法:

  1. 編譯時(shí)無法確定要?jiǎng)?chuàng)建對(duì)象的類
  2. 想讓子類決定運(yùn)行時(shí)創(chuàng)建什么
  3. 局部化信息。例如一個(gè)類有若干子類為其輔助類浮还,而你想返回具體的子類的信息

工廠方法可以讓創(chuàng)建出來的產(chǎn)品有一組共同的行為竟坛,而且客戶端無需修改任何代碼就可以擁有不同的產(chǎn)品,當(dāng)你想加入新產(chǎn)品的時(shí)候钧舌,只需增加一個(gè)子類担汤,無需修改客戶端代碼。

Demo

我們現(xiàn)在要生成兩種畫布洼冻,一個(gè)是ClothCanvasView(布質(zhì)風(fēng)格)另一個(gè)是PaperCanvasView(紙質(zhì)風(fēng)格)崭歧。我們將創(chuàng)建一個(gè)抽象的generator來生成這些畫布。

Factory method

如上圖撞牢,CanvasViewGenerator是一個(gè)基類率碾,包含一個(gè)工廠方法canvasViewWithFrame,其兩個(gè)子類負(fù)責(zé)實(shí)現(xiàn)和返回具體的CanvasView.

CanvasViewGenerator的代碼:

#import "CanvasViewGenerator.h"

@implementation CanvasViewGenerator

- (void)canvasViewWithFrame:(CGRect)aFrame
{ 
  return [[CanvasView alloc] initWithFrame:aFrame];
}

這里面只是返回?zé)o圖案的CanvasView普泡,具體的view需要子類來返回播掷。

PaperCanvasViewGenerator的代碼:

#import "PaperCanvasViewGenerator.h"

@implementation PaperCanvasViewGenerator

- (void)canvasViewWithFrame:(CGRect)aFrame
{ 
  return [[PaperCanvasView alloc] initWithFrame:aFrame];
}

ClothCanvasViewGenerator的代碼:

#import "ClothCanvasViewGenerator.h"

@implementation ClothCanvasViewGenerator

- (void)canvasViewWithFrame:(CGRect)aFrame
{ 
  return [[ClothCanvasView alloc] initWithFrame:aFrame];
}

當(dāng)使用畫布的時(shí)候审编,只需在CanvasViewController里面調(diào)用 [generator canvasViewWithFrame:aFrame]即可撼班,generator類型是基類類型。

工廠方法就是這些了垒酬,它的應(yīng)用非常普遍砰嘁,很好地封裝了工廠子類件炉,并與客戶端類解耦。下一篇介紹抽象工廠矮湘,以及和工廠方法的對(duì)比斟冕。

最后編輯于
?著作權(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)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用似踱、多...
    MinoyJet閱讀 3,922評(píng)論 1 15
  • 該文章屬于劉小壯原創(chuàng)隅熙,轉(zhuǎn)載請(qǐng)注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 12,744評(píng)論 29 59
  • 簡(jiǎn)單工廠模式 工廠模式我的理解是:他就是為了創(chuàng)建對(duì)象的 創(chuàng)建對(duì)象的時(shí)候,我們一般是alloc一個(gè)對(duì)象核芽,如果需要?jiǎng)?chuàng)建...
    GitHubPorter閱讀 8,062評(píng)論 6 16
  • 1 場(chǎng)景問題# 1.1 導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 考慮這樣一個(gè)實(shí)際應(yīng)用:實(shí)現(xiàn)一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架囚戚,來讓客戶選擇數(shù)據(jù)...
    七寸知架構(gòu)閱讀 6,590評(píng)論 6 73
  • 姑娘葉子和兵仔是通過相親認(rèn)識(shí)的,兵仔到是抱著以結(jié)婚為目的去戀愛轧简,葉子確是對(duì)兵仔不閑不淡驰坊,順其自然的態(tài)度。 兵仔對(duì)葉...
    行走的魚閱讀 372評(píng)論 0 2