Objective-C 工廠模式(上) -- 簡單工廠模式

簡單工廠模式是屬于創(chuàng)建型模式晶丘,又叫做靜態(tài)工廠方法(Static Factory Method)模式阀湿,但不屬于23種GOF設(shè)計模式之一那伐。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例见芹。簡單工廠模式是工廠模式家族中最簡單實用的模式庄呈,可以理解為是不同工廠模式的一個特殊實現(xiàn)助被。

定義解釋的文字很單調(diào), 下面舉例說明

比如一個手機(jī)工廠, 它能生產(chǎn)iPhone, Android, Nokia三種手機(jī).

這家工廠的營運(yùn)模式為廠家直銷, 就是直接賣給用戶. 用戶如果要買手機(jī)就直接給工廠下訂單要什么手機(jī), 工廠就直接按照客戶要的型號生產(chǎn)一部手機(jī)出來給客戶

這樣我們就有3個因素: 工廠, 手機(jī)型號, 用戶

下面我們構(gòu)建代碼

構(gòu)建手機(jī)型號, 先定義一個基本手機(jī)模型 定義手機(jī)基本的功能, 打電話 發(fā)短信

我們通過協(xié)議的方式來定義

PhoneProtocol.h

#import <Foundation/Foundation.h>

@protocol PhoneProtocol <NSObject>

@required

/**
 打電話
 */
- (void)makePhoneCall;

/**
 發(fā)短信
 */
- (void)sendMessage;

@end

下面開始創(chuàng)建手機(jī)模型

BaseDevice.h 手機(jī)基類

#import <Foundation/Foundation.h>
#import "PhoneProtocol.h"

@interface BaseDevice : NSObject <PhoneProtocol>

@end

BaseDevice.m

#import "BaseDevice.h"

@implementation BaseDevice

- (void)makePhoneCall {
    
}

- (void)sendMessage {
    
}

@end

iPhone模型

iPhonebaseDevice.h (假如iPhone有一個特別的功能, 指紋識別)

#import "BaseDevice.h"

@interface iPhoneBaseDevice : BaseDevice

- (void)fingerIdentifier;

@end

iPhoneBaseDevice.m

#import "iPhoneBaseDevice.h"

@implementation iPhoneBaseDevice

- (void)makePhoneCall {
    
    NSLog(@"iPhone makePhoneCall");
}

- (void)sendMessage {
    
    NSLog(@"iPhone sendMessage");
}

- (void)fingerIdentifier {
    
    NSLog(@"iPhone fingerIdentifier");
}

@end

Android手機(jī)

AndroidBaseDevice.h (假如Android手機(jī)有個特殊功能刷系統(tǒng))

#import "BaseDevice.h"

@interface AndroidBaseDevice : BaseDevice

- (void)flashOS;

@end

AndroidBaseDevice.m

#import "AndroidBaseDevice.h"

@implementation AndroidBaseDevice

- (void)makePhoneCall {
    
    NSLog(@"Android makePhoneCall");
}

- (void)sendMessage {
    
    NSLog(@"Android sendMessage");
}

- (void)flashOS {
    
    NSLog(@"Android flashOS");
}

@end

Nokia手機(jī)

NokiaBaseDevice.h (假如Nokia手機(jī)一個特殊功能砸核桃)

#import "BaseDevice.h"

@interface NokiaBaseDevice : BaseDevice

- (void)knockNut;

@end

NokiaBaseDevice.m

#import "NokiaBaseDevice.h"

@implementation NokiaBaseDevice

- (void)makePhoneCall {
    
    NSLog(@"Nokia makePhoneCall");
}

- (void)sendMessage {
    
    NSLog(@"Nokia sendMessage");
}

- (void)knockNut {
    
    NSLog(@"Nokia knockNut");
}

@end

手機(jī)模型創(chuàng)建完了, 接著我們開始創(chuàng)建生產(chǎn)手機(jī)的工廠, 它有一個生產(chǎn)手機(jī)的方法

DeviceFactory.h

#import <Foundation/Foundation.h>
#import "iPhoneBaseDevice.h"
#import "NokiaBaseDevice.h"
#import "AndroidBaseDevice.h"

typedef enum : NSUInteger {
    kiPhone = 0x11,
    kAndroid,
    kNokia,
} EPhoneDevice;

@interface DeviceFactory : NSObject

/**
 制造手機(jī)方法

 @param type 手機(jī)類型
 @return 手機(jī)實例
 */
+ (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type;

@end

DeviceFactory.m

#import "DeviceFactory.h"

@implementation DeviceFactory

+ (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type {
    
    BaseDevice *device = nil;
    if (type == kiPhone) {
        
        device = [[iPhoneBaseDevice alloc] init];
        
    } else if (type == kNokia) {
        
        device = [[NokiaBaseDevice alloc] init];
        
    } else if (type == kAndroid) {
        
        device = [[AndroidBaseDevice alloc] init];
        
    }
    
    return device;
}

@end

好了, 現(xiàn)在是用戶就是我們 也就是Controller可以開始定做手機(jī)了

#import "ViewController.h"
#import "DeviceFactory.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //創(chuàng)建一個iPhone手機(jī)實例
    iPhoneBaseDevice *phone = [DeviceFactory createPhoneWithDeviceType: kiPhone];
    
    //打電話
    [phone makePhoneCall];
    
    //發(fā)短信
    [phone sendMessage];
    
    //指紋識別
    [phone fingerIdentifier];
    
}

@end

總結(jié): 簡單工廠方法就是定義創(chuàng)建對象的接口, 讓子類決定實例化哪一個類. 工廠方法使得一個類的實例化延遲到其子類

何時使用工廠方法呢?

1 編譯時無法準(zhǔn)確預(yù)期要創(chuàng)建的對象的類

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

3 若有若干個輔助類為其子類剖张, 而你想將返回哪個子類這一信息局部化

使用這一模式的最低限度是, 工廠方法能給予類在變更返回哪一種對象這一點上更多的靈活性

最后說明, 簡單工廠模式可以比較清晰便捷的實現(xiàn)同一模型對象的創(chuàng)建

但有一個弊端就是, 只能定制創(chuàng)建已經(jīng)寫好的對象, 比如上面這個工廠只能生成iPhone/Android/Nokia這三種手機(jī),

如果你想再定制華為手機(jī)或者小米手機(jī), 那就要工廠去建華為和小米的手機(jī)生產(chǎn)線, 所以這種情況我們就要增加模型對象并修改工廠方法了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揩环,一起剝皮案震驚了整個濱河市搔弄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丰滑,老刑警劉巖顾犹,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡炫刷,警方通過查閱死者的電腦和手機(jī)擎宝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浑玛,“玉大人绍申,你說我怎么就攤上這事」苏茫” “怎么了极阅?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拘央。 經(jīng)常有香客問我涂屁,道長,這世上最難降的妖魔是什么灰伟? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任拆又,我火速辦了婚禮,結(jié)果婚禮上栏账,老公的妹妹穿的比我還像新娘帖族。我一直安慰自己,他們只是感情好挡爵,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布竖般。 她就那樣靜靜地躺著,像睡著了一般茶鹃。 火紅的嫁衣襯著肌膚如雪涣雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天闭翩,我揣著相機(jī)與錄音挣郭,去河邊找鬼。 笑死疗韵,一個胖子當(dāng)著我的面吹牛兑障,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕉汪,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼流译,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了者疤?” 一聲冷哼從身側(cè)響起福澡,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驹马,沒想到半個月后竞漾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眯搭,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年业岁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寇蚊。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡笔时,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仗岸,到底是詐尸還是另有隱情允耿,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布扒怖,位于F島的核電站较锡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盗痒。R本人自食惡果不足惜蚂蕴,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俯邓。 院中可真熱鬧骡楼,春花似錦、人聲如沸稽鞭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朦蕴。三九已至篮条,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吩抓,已是汗流浹背涉茧。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留琴拧,地道東北人降瞳。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像蚓胸,于是被迫代替她去往敵國和親挣饥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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