簡(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ì)象并修改工廠方法了