IOS设计模式-简单工厂

为什么 “简单工厂原理” 叫简单工厂,因为这个工厂类不是抽象类,而是实体类,工厂本身就是一个具体的对象。



写一个例子演示简单工厂模式:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
协议的用法,小何子总结:
一个类如果实现了某个协议,这个协议中的方法就可以直接在这个类的@implementation中实现
注意:协议中的方法不需要在这个类@interface中声明出来

接着,继承实现协议的类的子类,协议中得方法同样不需要在@interface中声明,
        但需要哪个协议里的方法的话就在@implementation中实现。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


手机协议,提供了所有手机的共同的功能。
记住:使用协议的目的,是为了能统一使用的接口,也是为了客户端使用是要遵循某项协议的。
PhoneProtocol.h:

 1 #import <Foundation/Foundation.h>
 2 
 3 @protocol PhoneProtocol <NSObject>
 4 
 5 @required
 6 
 7 /**
 8  *  打电话
 9  */
10 - (void)phoneCall;
11 
12 /**
13  *  发短信
14  */
15 - (void)sendMessage;
16 
17 @end

=====================================================
基本的手机设备,抽象类,具备手机的基本的功能,
    接收一个协议并继承必须要的功能:打电话和发短信
BaseDevie.h:

 1 #import <Foundation/Foundation.h>
 2 #import "PhoneProtocol.h"
 3 
 4 @interface BaseDevie : NSObject <PhoneProtocol>
 5 
 6 @end

BaseDevie.m:

 1 #import "BaseDevie.h"
 2 
 3 @implementation BaseDevie
 4 
 5 - (void)phoneCall {
 6 }
 7 
 8 - (void)sendMessage {
 9 }
10 
11 @end

=====================================================
DeviceFactory.h:

 1 #import <Foundation/Foundation.h>
 2 #import "BaseDevie.h"
 3 #import "iPhoneDevice.h"
 4 #import "AndroidDevice.h"
 5 #import "NokiaDevice.h"
 6 
 7 typedef enum : NSUInteger {
 8     
 9     kiPhone   = 0x11,
10     kAndroid,
11     kNokia,
12     
13 } EDevieType;
14 简单工厂模式的工厂类,是根据客户端的某条指令来生产具体某个设备,这里就通过枚举列举出用户的具体相关的指令。
15 总结:工厂模式经常可以和枚举搭配,因为工厂模式生成基本行为相同拓展行为不同的同一类对象
16 这些不同但基础本质相容的对象,可以用枚举列举。
17 例如:这里就用枚举列举了:iPhone、Android、Nokia三种手机。
18 枚举的名字EDevieType的开头是个习惯用法用E。
19 @interface DeviceFactory : NSObject
20 
21 //首先,这个工厂类会返回一个对象,什么样的对象呢?这个对象本身就是实现了接口PhoneProtocol的对象
22 /**
23  *  根据用户提交的指令创建出具体的手机
24  *
25  *  @param type 创建的指令
26  *
27  *  @return 创建出的手机
28  */
29 + (BaseDevie <PhoneProtocol> *)deviceFactoryWithDevieType:(EDevieType)type;
30 
31 @end

DeviceFactory.m:

 1 #import "DeviceFactory.h"
 2 
 3 @implementation DeviceFactory
 4 
 5 + (BaseDevie <PhoneProtocol> *)deviceFactoryWithDevieType:(EDevieType)type {
 6 
 7     BaseDevie <PhoneProtocol> *device = nil;//使用实现协议的类,声明指针对象的时候记得带上<协议>
 8     
 9     if (type == kiPhone) {
10         
11         device = [[iPhoneDevice alloc] init];
12         
13     }  else if (type == kAndroid) {
14     
15         device = [[AndroidDevice alloc] init];
16         
17     }  else if (type == kNokia) {
18         
19         device = [[NokiaDevice alloc] init];
20         
21     }
22     
23     return device;
24 }
25 
26 @end

=====================================================
iPhoneDevice.h:

 1 #import "BaseDevie.h"
 2 
 3 @interface iPhoneDevice : BaseDevie
 4 
 5 /**
 6  *  指纹识别
 7  *  多的一个功能,也是iPhone自己独有的功能。也是区别同类产品的关键。
 8  *  特有的功能就可以在自己的@interface中实现。
 9  */
10 - (void)fingerprintIndetification;
11 
12 @end

iPhoneDevice.m:

 1 #import "iPhoneDevice.h"
 2 
 3 @implementation iPhoneDevice
 4 因为继承自实现了协议的BaseDevie,所以这里只需要在implementation实现协议里的方法就可以了。
 5 - (void)phoneCall {
 6  
 7     NSLog(@"iPhone phoneCall");
 8 }
 9 
10 - (void)sendMessage {
11     
12     NSLog(@"iPhone sendMessage");
13 }
14 
15 - (void)fingerprintIndetification {
16 
17     NSLog(@"iPhone fingerprintIndetification");
18 }
19 
20 @end

=====================================================
AndroidDevice.h:

 1 #import "BaseDevie.h"
 2 
 3 @interface AndroidDevice : BaseDevie
 4 
 5 /**
 6  *  定制主题
 7  */
 8 - (void)customTheme;
 9 
10 @end

AndroidDevice.m:

 1 #import "AndroidDevice.h"
 2 
 3 @implementation AndroidDevice
 4 
 5 - (void)phoneCall {
 6     
 7     NSLog(@"Android phoneCall");
 8 }
 9 
10 - (void)sendMessage {
11     
12     NSLog(@"Android sendMessage");
13 }
14 
15 - (void)customTheme {
16 
17     NSLog(@"Android customTheme");
18 }
19 
20 @end

=====================================================
NokiaDevice.h:

 1 #import "BaseDevie.h"
 2 
 3 @interface NokiaDevice : BaseDevie
 4 
 5 /**
 6  *  敲核桃
 7  */
 8 - (void)knockWalnut;
 9 
10 @end

NokiaDevice.m:

 1 #import "NokiaDevice.h"
 2 
 3 @implementation NokiaDevice
 4 
 5 - (void)phoneCall {
 6     
 7     NSLog(@"Nokia phoneCall");
 8 }
 9 
10 - (void)sendMessage {
11     
12     NSLog(@"Nokia sendMessage");
13 }
14 
15 - (void)knockWalnut {
16 
17     NSLog(@"Nokia knockWalnut");
18 }
19 
20 @end

==============================================================

客户端只有ViewController.m中:

 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     // 工厂中创建出具体产品
15     iPhoneDevice *iPhone = (iPhoneDevice *)[DeviceFactory deviceFactoryWithDevieType:kiPhone];
16     
17     // 使用产品的特有的功能
18     [iPhone fingerprintIndetification];
19     
20     //如果工厂中创建出具体产品,是这样的:
21     //BaseDevie *iPhone = [DeviceFactory deviceFactoryWithDevieType:kiPhone];
22     //这样的话,手机就不能使用自己特有的功能,也就是不能使用自己类的@interface中声明的方法
23 }
24 
25 @end


简单工厂:工厂类通过客户端发送一个指令产生具体的产品,而这些产品彼此之间都有共同的特性,共同的特性由协议规定了,但是具体的产品对象有自己特有的功能,就需要具体的声明和实现。这就是简单工厂。

那么简单工厂的使用场景
1. 简化生产流程
    客户只关心最终产品,所以可以把具体生产流程封装起来,通过简单工厂创建最终产品。所以起到了简化生产流程。
2. 隔离生产产品的细节
    前面一点提到了。
3. 不同类型的产品之间有着一些共同的功能
    共同的功能可以通过协议来设定和规划。
4. 一个具体的工厂
    是直接实现的工厂,而不是某个通过继承或者抽象的方法来实现生产的需求。


源码下载链接:http://pan.baidu.com/s/1bnynlQf 密码:ss43

 
原文地址:https://www.cnblogs.com/goodboy-heyang/p/4916159.html