Objective-C 工厂模式(上) -- 简单工厂模式

2019-10-15 11:39:43 浏览数 (1)

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

定义解释的文字很单调, 下面举例说明

比如一个手机工厂, 它能生产iPhone, Android, Nokia三种手机.

这家工厂的营运模式为厂家直销, 就是直接卖给用户. 用户如果要买手机就直接给工厂下订单要什么手机, 工厂就直接要找客户要的型号生产一部手机出来给客户

这样我们就有3个因素: 工厂, 手机型号, 用户

下面我们构建代码

构建手机型号, 先定义一个基本手机模型 定义手机基本的功能, 打电话 发短信

我们通过协议的方式来定义

PhoneProtocol.h

代码语言:javascript复制
 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 手机基类

代码语言:javascript复制
1 #import <Foundation/Foundation.h>
2 #import "PhoneProtocol.h"
3 
4 @interface BaseDevice : NSObject <PhoneProtocol>
5 
6 @end

BaseDevice.m

代码语言:javascript复制
 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有一个特别的功能, 指纹识别)

代码语言:javascript复制
1 #import "BaseDevice.h"
2 
3 @interface iPhoneBaseDevice : BaseDevice
4 
5 - (void)fingerIdentifier;
6 
7 @end

iPhoneBaseDevice.m

代码语言:javascript复制
 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手机有个特殊功能刷系统)

代码语言:javascript复制
1 #import "BaseDevice.h"
2 
3 @interface AndroidBaseDevice : BaseDevice
4 
5 - (void)flashOS;
6 
7 @end

AndroidBaseDevice.m

代码语言:javascript复制
 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手机一个特殊功能砸核桃)

代码语言:javascript复制
1 #import "BaseDevice.h"
2 
3 @interface NokiaBaseDevice : BaseDevice
4 
5 - (void)knockNut;
6 
7 @end

NokiaBaseDevice.m

代码语言:javascript复制
 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

代码语言:javascript复制
 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

代码语言:javascript复制
 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可以开始定做手机了

代码语言:javascript复制
 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这三种手机,

如果你想再定制华为手机或者小米手机, 那就要工厂去建华为和小米的手机生产线, 所以这种情况我们就要增加模型对象并修改工厂方法了

0 人点赞