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. 一个具体的工厂
是直接实现的工厂,而不是某个通过继承或者抽象的方法来实现生产的需求。

相关文章
|
8月前
|
设计模式 测试技术 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
234 0
|
1月前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
4月前
|
设计模式
设计模式-简单工厂和工厂方法
设计模式-简单工厂和工厂方法
|
20天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
5月前
|
设计模式 算法
设计模式思考,简单工厂模式和策略模式的区别?
设计模式思考,简单工厂模式和策略模式的区别?
|
22天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
14 0
|
8月前
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
272 0
|
8月前
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
410 0
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
|
4月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
103 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
|
4月前
|
设计模式 Go 开发工具
Golang设计模式——00简单工厂模式
Golang设计模式——00简单工厂模式
22 0