工廠模式

Objective-C編程之道 iOS設(shè)計模式解析
iOS設(shè)計模式解析-工廠模式
iOS設(shè)計模式解析-抽象工廠模式
iOS設(shè)計模式解析-外觀模式
iOS設(shè)計模式解析-中介者模式
iOS設(shè)計模式解析-觀察者模式
iOS設(shè)計模式解析-裝飾模式
iOS設(shè)計模式解析-責(zé)任鏈模式
iOS設(shè)計模式解析-模板方法
iOS設(shè)計模式解析-策略模式
iOS設(shè)計模式解析-享元模式
iOS設(shè)計模式解析-代碼地址

何為工廠方法模式

工廠方法也稱為虛構(gòu)造器,它適用于這種情況:一個類無法預(yù)期需要生產(chǎn)哪個類的對象,想讓其子類來指定所生成的對象。

工廠方法模式:定義創(chuàng)建對象的接口十气,讓子類決定實例化哪一個類,工廠方法使得一個類的實例化延遲到其子類。

何時使用工廠方法

在以下情形嘁字,自然會考慮使用這一模式夫椭。

  • 編譯時無法準(zhǔn)確預(yù)期要創(chuàng)建的對象的類掸掸。
  • 類想讓其子類決定在運行時創(chuàng)建什么。
  • 類有若干輔助類為其子類蹭秋,而你想將返回哪個子類這一信息局部化扰付。

畫布的實例:

最上層的CanvasView定義了任意CanvasView類型的默認(rèn)行為,其子類用不同圖像在屏幕上展現(xiàn)各種紋理并展現(xiàn)其他可能的特定行為仁讨,PaperCanvasViewClothCanvasView的代碼段如下

PaperCanvasView
#import "CanvasView.h"

@interface PaperCanvasView : CanvasView

@end
#import "PaperCanvasView.h"

@implementation PaperCanvasView

- (id)initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame]){
        UIImage *backgroundImage = [UIImage imageNamed:@"paper"];
        UIImageView *backgroundView = [[UIImageView alloc]initWithImage:backgroundImage];
        [self addSubview:backgroundView];
        NSLog(@"paper");
    }
    return self;
}

@end

注意:@"paper"是紙紋理的圖像的名字羽莺,它被賦給 UIImageView 的實例 backgroundView 然后 backgroundView 作為子視圖添加到主內(nèi)容視圖,以顯示紙的圖像

ClothCanvasView
#import "CanvasView.h"

@interface ClothCanvasView : CanvasView

@end
#import "ClothCanvasView.h"

@implementation ClothCanvasView

- (id)initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame]){
        UIImage *backgroundImage = [UIImage imageNamed:@"cloth"];
        UIImageView *backgroundView = [[UIImageView alloc]initWithImage:backgroundImage];
        [self addSubview:backgroundView];
        NSLog(@"cloth");
    }
    return self;
}
@end

PaperCanvasViewClothCanvasView的實現(xiàn)非常易懂洞豁,它們繼承了CanvasView類中定義的默認(rèn)行為盐固,現(xiàn)在我們定義好了產(chǎn)品,還需要為它們各自定義一個生成器丈挟。

畫布生成器

CanvasViewGenerator
#import <Foundation/Foundation.h>
#import "CanvasView.h"

@interface CanvasViewGenerator : NSObject

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame;

@end
#import "CanvasViewGenerator.h"

@implementation CanvasViewGenerator

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

@end

注意:CanvasViewGenerator有一個方法canvasViewWithFrame:(CGRect)aFrame刁卜,這個方法的默認(rèn)實現(xiàn)只是創(chuàng)建并返回?zé)o圖案的CanvasView,這個生成器的子類需要重載這個方法曙咽,返回CanvasView的實際具體類型

PaperCanvasViewGenerator
#import "CanvasViewGenerator.h"
#import "PaperCanvasView.h"

@interface PaperCanvasViewGenerator : CanvasViewGenerator

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame;

@end
#import "PaperCanvasViewGenerator.h"

@implementation PaperCanvasViewGenerator

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

@end

PaperCanvasViewGenerator重載canvasViewWithFrame:方法蛔趴,返回PaperCanvasView的實例。

ClothCanvasViewGenerator
#import "CanvasViewGenerator.h"
#import "ClothCanvasView.h"

@interface ClothCanvasViewGenerator : CanvasViewGenerator

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame;

@end
#import "ClothCanvasViewGenerator.h"

@implementation ClothCanvasViewGenerator

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame
{
    return [[ClothCanvasView alloc]initWithFrame:aFrame];
}
@end

使用畫布

ViewController現(xiàn)在使用原來的CanvasView例朱。為了在運行時加以改變孝情,需要在調(diào)用的時候添加一個方法之拨,通過CanvasViewGenerator取得CanvasView的實例

注意:CanvasViewGenerator defaultGenerator = [[PaperCanvasViewGenerator alloc]init]
此時編譯時
defaultGeneratorCanvasViewGenerator類型,運行時的類型由真正初始化的對象(PaperCanvasViewGenerator)*決定

- (void)viewDidLoad {
    [super viewDidLoad];
    CanvasViewGenerator *defaultGenerator = [[CanvasViewGenerator alloc]init];
    [self loadCanvasViewWithGenerator:defaultGenerator];
    
}

- (void)loadCanvasViewWithGenerator:(CanvasViewGenerator *)generator
{
    [self.canvasView removeFromSuperview];//移除
    CGRect aFrame = CGRectMake(0, 0, 320, 436);
    CanvasView *aCanvasView = [generator canvasViewWithFrame:aFrame];
    self.canvasView = aCanvasView;
    [self.view addSubview:self.canvasView];
}

因此咧叭,以后用戶選擇特定的畫布類型時蚀乔,應(yīng)用程序會把具體生成器的實例傳給loadCanvasViewWithGenerator:方法,原來的畫布將被新畫布所替換菲茬。

//PaperCanvasViewGenerator生成器
CanvasViewGenerator *defaultGenerator = [[PaperCanvasViewGenerator alloc]init];
//ClothCanvasViewGenerator生成器
CanvasViewGenerator *defaultGenerator = [[ClothCanvasViewGenerator alloc]init];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吉挣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子婉弹,更是在濱河造成了極大的恐慌睬魂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镀赌,死亡現(xiàn)場離奇詭異氯哮,居然都是意外死亡,警方通過查閱死者的電腦和手機商佛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門喉钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人良姆,你說我怎么就攤上這事肠虽。” “怎么了玛追?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵税课,是天一觀的道長。 經(jīng)常有香客問我痊剖,道長韩玩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任陆馁,我火速辦了婚禮找颓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氮惯。我一直安慰自己叮雳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布妇汗。 她就那樣靜靜地躺著帘不,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杨箭。 梳的紋絲不亂的頭發(fā)上寞焙,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼捣郊。 笑死辽狈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呛牲。 我是一名探鬼主播刮萌,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娘扩!你這毒婦竟也來了着茸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤琐旁,失蹤者是張志新(化名)和其女友劉穎涮阔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灰殴,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡敬特,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牺陶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伟阔。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖义图,靈堂內(nèi)的尸體忽然破棺而出减俏,到底是詐尸還是另有隱情召烂,我是刑警寧澤碱工,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奏夫,受9級特大地震影響怕篷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酗昼,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一廊谓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麻削,春花似錦蒸痹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扫责,卻和暖如春榛鼎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工者娱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抡笼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓黄鳍,卻偏偏與公主長得像推姻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子框沟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • 該文章屬于劉小壯原創(chuàng)拾碌,轉(zhuǎn)載請注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 12,746評論 29 59
  • 工廠模式是最常用的一類創(chuàng)建型設(shè)計模式,通常我們所說的工廠模式是指工廠方法模式街望,它也是使用頻率最高的工廠模式校翔。本章將...
    justCode_閱讀 849評論 0 3
  • 除了使用new操作符之外,還有更多制造對象的方法灾前。你講了解到實例化這個活動不應(yīng)該總是公開的進行防症,也會認(rèn)識到初始化經(jīng)...
    pilipalaKing閱讀 367評論 0 0
  • 最近不知道為什么,總是喜歡看各種小孩子的東西哎甲,小小的衣服和鞋子蔫敲,每一個都特別可愛,腦補一個可愛的寶寶穿上的樣子炭玫,都...
    嘿嘿嘿嘿嘿嘿哈閱讀 166評論 0 0
  • 引子 落日的余輝映照在江面上奈嘿,奔流不息的長江像一條玉帶,在瑩瑩光芒的點綴中吞加,執(zhí)著地向東而去裙犹。這時已是傍晚時分,江的...
    若水如墨閱讀 337評論 0 0