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

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

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

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

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

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

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

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

我們通過(guò)協(xié)議的方式來(lái)定義

PhoneProtocol.h

#import <Foundation/Foundation.h>

@protocol PhoneProtocol <NSObject>

@required

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

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

@end

下面開(kāi)始創(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有一個(gè)特別的功能, 指紋識(shí)別)

#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ī)有個(gè)特殊功能刷系統(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ī)一個(gè)特殊功能砸核桃)

#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)建完了, 接著我們開(kāi)始創(chuàng)建生產(chǎn)手機(jī)的工廠, 它有一個(gè)生產(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ī)實(shí)例
 */
+ (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可以開(kāi)始定做手機(jī)了

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

@interface ViewController ()

@end

@implementation ViewController

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

@end

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

何時(shí)使用工廠方法呢?

1 編譯時(shí)無(wú)法準(zhǔn)確預(yù)期要?jiǎng)?chuàng)建的對(duì)象的類

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容