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

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

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

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

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

 #import <Foundation/Foundation.h>

 @protocol PhoneProtocol <NSObject>

 @required

 /**
* 打电话
*/
- (void)phoneCall; /**
* 发短信
*/
- (void)sendMessage; @end

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

 #import <Foundation/Foundation.h>
#import "PhoneProtocol.h" @interface BaseDevie : NSObject <PhoneProtocol> @end

BaseDevie.m:

 #import "BaseDevie.h"

 @implementation BaseDevie

 - (void)phoneCall {
} - (void)sendMessage {
} @end

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

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

DeviceFactory.m:

 #import "DeviceFactory.h"

 @implementation DeviceFactory

 + (BaseDevie <PhoneProtocol> *)deviceFactoryWithDevieType:(EDevieType)type {

     BaseDevie <PhoneProtocol> *device = nil;//使用实现协议的类,声明指针对象的时候记得带上<协议>

     if (type == kiPhone) {

         device = [[iPhoneDevice alloc] init];

     }  else if (type == kAndroid) {

         device = [[AndroidDevice alloc] init];

     }  else if (type == kNokia) {

         device = [[NokiaDevice alloc] init];

     }

     return device;
} @end

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

 #import "BaseDevie.h"

 @interface iPhoneDevice : BaseDevie

 /**
* 指纹识别
* 多的一个功能,也是iPhone自己独有的功能。也是区别同类产品的关键。
* 特有的功能就可以在自己的@interface中实现。
*/
- (void)fingerprintIndetification; @end

iPhoneDevice.m:

 #import "iPhoneDevice.h"

 @implementation iPhoneDevice
因为继承自实现了协议的BaseDevie,所以这里只需要在implementation实现协议里的方法就可以了。
- (void)phoneCall { NSLog(@"iPhone phoneCall");
} - (void)sendMessage { NSLog(@"iPhone sendMessage");
} - (void)fingerprintIndetification { NSLog(@"iPhone fingerprintIndetification");
} @end

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

 #import "BaseDevie.h"

 @interface AndroidDevice : BaseDevie

 /**
* 定制主题
*/
- (void)customTheme; @end

AndroidDevice.m:

 #import "AndroidDevice.h"

 @implementation AndroidDevice

 - (void)phoneCall {

     NSLog(@"Android phoneCall");
} - (void)sendMessage { NSLog(@"Android sendMessage");
} - (void)customTheme { NSLog(@"Android customTheme");
} @end

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

 #import "BaseDevie.h"

 @interface NokiaDevice : BaseDevie

 /**
* 敲核桃
*/
- (void)knockWalnut; @end

NokiaDevice.m:

 #import "NokiaDevice.h"

 @implementation NokiaDevice

 - (void)phoneCall {

     NSLog(@"Nokia phoneCall");
} - (void)sendMessage { NSLog(@"Nokia sendMessage");
} - (void)knockWalnut { NSLog(@"Nokia knockWalnut");
} @end

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

客户端只有ViewController.m中:

 #import "ViewController.h"
#import "DeviceFactory.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 工厂中创建出具体产品
iPhoneDevice *iPhone = (iPhoneDevice *)[DeviceFactory deviceFactoryWithDevieType:kiPhone]; // 使用产品的特有的功能
[iPhone fingerprintIndetification]; //如果工厂中创建出具体产品,是这样的:
//BaseDevie *iPhone = [DeviceFactory deviceFactoryWithDevieType:kiPhone];
//这样的话,手机就不能使用自己特有的功能,也就是不能使用自己类的@interface中声明的方法
} @end

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

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

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

 

IOS设计模式-简单工厂的更多相关文章

  1. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  2. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. java设计模式--简单工厂

    java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...

  4. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  5. iOS开发-简单工厂模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...

  6. C++设计模式——简单工厂模式

    简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...

  7. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...

  8. C#设计模式-简单工厂

    工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(F ...

  9. 深入浅出设计模式——简单工厂模式(Simple Factory)

    介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...

随机推荐

  1. VIM配置相关记录

    把一直使用中的vim配置做个GIT入库管理,也把之前积累在机器上的文档,做个汇总. https://github.com/wujuguang/kyvim 1. 安装完整版vim vi和vim的区别?在 ...

  2. [git]查看某一行代码是谁写的

    git blame filename,'blame'意思为责怪!哈哈哈. 就会列出来每行的修改纪录.你可以通过行数或者代码来查看,是谁的锅!

  3. [Windows] 批处理文件系统服务控制

    在cmd下可有两种方法打开,net和sc. net只能用于用于打开没有被禁用的服务. 启动: net start 服务名 停止: net stop 服务名 sc可打开被禁用的服务. sc config ...

  4. SQL各种连接查询详解(左连接、右连接..)

    一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的.语句1:隐式 ...

  5. ASP.NET运行时详解 生命周期入口分析

    说起ASP.NET的生命周期,网上有很多的介绍.之前也看了些这方面的博客,但我感觉很多程序猿像我一样,看的时候似乎明白,一段时间过后又忘了.所以,最近Heavi花了一段时间研究ASP.NET的源代码, ...

  6. Build 2016概览

    很快Microsoft Build 2016马上就要开始,在直播放出来之前,微软已经提前把本次大会期间的所有课程列表放了出来,你可以在这里看到: https://channel9.msdn.com/E ...

  7. 簡單SQL存儲過程實例

    簡單SQL存儲過程實例 摘自:http://blog.csdn.net/libra6956/article/details/5589173 实例1:只返回单一记录集的存储过程. 银行存款表(bankM ...

  8. mssql server提示无权限

    mssqlserver在查询系统视图时(如:select * from sys.syscacheobjects),有时会报出如下提示: 消息 300,级别 14,状态 1,第 1 行VIEW SERV ...

  9. 重新想象 Windows 8.1 Store Apps (93) - 控件增强: GridView, ListView

    [源码下载] 重新想象 Windows 8.1 Store Apps (93) - 控件增强: GridView, ListView 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  10. x3dom 1.6 发布

    X3DOM 库的1.6版本发布了,以下是最重要的一些变化: 完整的新的文档频道 -  http://doc.x3dom.org x3dom实例频道 - http://examples.x3dom.or ...