Objective-C 工厂模式(上) -- 简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
定义解释的文字很单调, 下面举例说明
比如一个手机工厂, 它能生产iPhone, Android, Nokia三种手机.
这家工厂的营运模式为厂家直销, 就是直接卖给用户. 用户如果要买手机就直接给工厂下订单要什么手机, 工厂就直接要找客户要的型号生产一部手机出来给客户
这样我们就有3个因素: 工厂, 手机型号, 用户
下面我们构建代码
构建手机型号, 先定义一个基本手机模型 定义手机基本的功能, 打电话 发短信
我们通过协议的方式来定义
PhoneProtocol.h
1 #import <Foundation/Foundation.h> 2 3 @protocol PhoneProtocol <NSObject> 4 5 @required 6 7 /** 8 打电话 9 */ 10 - (void)makePhoneCall; 11 12 /** 13 发短信 14 */ 15 - (void)sendMessage; 16 17 @end
下面开始创建手机模型
BaseDevice.h 手机基类
1 #import <Foundation/Foundation.h> 2 #import "PhoneProtocol.h" 3 4 @interface BaseDevice : NSObject <PhoneProtocol> 5 6 @end
BaseDevice.m
1 #import "BaseDevice.h" 2 3 @implementation BaseDevice 4 5 - (void)makePhoneCall { 6 7 } 8 9 - (void)sendMessage { 10 11 } 12 13 @end
iPhone模型
iPhonebaseDevice.h (假如iPhone有一个特别的功能, 指纹识别)
1 #import "BaseDevice.h" 2 3 @interface iPhoneBaseDevice : BaseDevice 4 5 - (void)fingerIdentifier; 6 7 @end
iPhoneBaseDevice.m
1 #import "iPhoneBaseDevice.h" 2 3 @implementation iPhoneBaseDevice 4 5 - (void)makePhoneCall { 6 7 NSLog(@"iPhone makePhoneCall"); 8 } 9 10 - (void)sendMessage { 11 12 NSLog(@"iPhone sendMessage"); 13 } 14 15 - (void)fingerIdentifier { 16 17 NSLog(@"iPhone fingerIdentifier"); 18 } 19 20 @end
Android手机
AndroidBaseDevice.h (假如Android手机有个特殊功能刷系统)
1 #import "BaseDevice.h" 2 3 @interface AndroidBaseDevice : BaseDevice 4 5 - (void)flashOS; 6 7 @end
AndroidBaseDevice.m
1 #import "AndroidBaseDevice.h" 2 3 @implementation AndroidBaseDevice 4 5 - (void)makePhoneCall { 6 7 NSLog(@"Android makePhoneCall"); 8 } 9 10 - (void)sendMessage { 11 12 NSLog(@"Android sendMessage"); 13 } 14 15 - (void)flashOS { 16 17 NSLog(@"Android flashOS"); 18 } 19 20 @end
Nokia手机
NokiaBaseDevice.h (假如Nokia手机一个特殊功能砸核桃)
1 #import "BaseDevice.h" 2 3 @interface NokiaBaseDevice : BaseDevice 4 5 - (void)knockNut; 6 7 @end
NokiaBaseDevice.m
1 #import "NokiaBaseDevice.h" 2 3 @implementation NokiaBaseDevice 4 5 - (void)makePhoneCall { 6 7 NSLog(@"Nokia makePhoneCall"); 8 } 9 10 - (void)sendMessage { 11 12 NSLog(@"Nokia sendMessage"); 13 } 14 15 - (void)knockNut { 16 17 NSLog(@"Nokia knockNut"); 18 } 19 20 @end
手机模型创建完了, 接着我们开始创建生产手机的工厂, 它有一个生产手机的方法
DeviceFactory.h
1 #import <Foundation/Foundation.h> 2 #import "iPhoneBaseDevice.h" 3 #import "NokiaBaseDevice.h" 4 #import "AndroidBaseDevice.h" 5 6 typedef enum : NSUInteger { 7 kiPhone = 0x11, 8 kAndroid, 9 kNokia, 10 } EPhoneDevice; 11 12 @interface DeviceFactory : NSObject 13 14 /** 15 制造手机方法 16 17 @param type 手机类型 18 @return 手机实例 19 */ 20 + (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type; 21 22 @end
DeviceFactory.m
1 #import "DeviceFactory.h" 2 3 @implementation DeviceFactory 4 5 + (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type { 6 7 BaseDevice *device = nil; 8 if (type == kiPhone) { 9 10 device = [[iPhoneBaseDevice alloc] init]; 11 12 } else if (type == kNokia) { 13 14 device = [[NokiaBaseDevice alloc] init]; 15 16 } else if (type == kAndroid) { 17 18 device = [[AndroidBaseDevice alloc] init]; 19 20 } 21 22 return device; 23 } 24 25 @end
好了, 现在是用户就是我们 也就是Controller可以开始定做手机了
1 #import "ViewController.h" 2 #import "DeviceFactory.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 12 [super viewDidLoad]; 13 14 //创建一个iPhone手机实例 15 iPhoneBaseDevice *phone = [DeviceFactory createPhoneWithDeviceType: kiPhone]; 16 17 //打电话 18 [phone makePhoneCall]; 19 20 //发短信 21 [phone sendMessage]; 22 23 //指纹识别 24 [phone fingerIdentifier]; 25 26 } 27 28 29 30 @end
总结: 简单工厂方法就是定义创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使得一个类的实例化延迟到其子类
何时使用工厂方法呢?
#1 编译时无法准确预期要创建的对象的类
#2 类想让其子类决定在运行时创建什么
#3 若有若干个辅助类为其子类, 而你想将返回哪个子类这一信息局部化
使用这一模式的最低限度是, 工厂方法能给予类在变更返回哪一种对象这一点上更多的灵活性
最后说明, 简单工厂模式可以比较清晰便捷的实现同一模型对象的创建
但有一个弊端就是, 只能定制创建已经写好的对象, 比如上面这个工厂只能生成iPhone/Android/Nokia这三种手机,
如果你想再定制华为手机或者小米手机, 那就要工厂去建华为和小米的手机生产线, 所以这种情况我们就要增加模型对象并修改工厂方法了