簡單工廠模式是屬于創(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)線, 所以這種情況我們就要增加模型對象并修改工廠方法了