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

时间: 2024-10-11 04:28:11

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

设计模式 -- 简单工厂(Java&amp;&amp;PHP)

面向对象设计的基本原则                                                                 单一职责系统中的每一个对象应该只有一个单独的职责,所有对象关注的应该是自身职责的完成.基本思想:高内聚,低耦合. 开闭原则一个对象对扩展开放,对修改关闭.基本思想:对类的改动是通过增加代码进行的,而不是修改现有的代码. 里氏替换原则在任意父类出现的地方,都可以使用子类来替代. 依赖注入原则要依赖于抽象,不要依赖于具体的实现.基本思想:在开发中尽量

一口一个设计模式--简单工厂VS工厂VS抽象工厂

前几天一直在准备大学毕业,始终脱不开身,今天终于有时间进行设计模式的研究.咱们今天研究的话题是工厂家族三种设计模式的对比--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版.知道了它们之间的宏观关系,下面我带它们从一次次蜕变了解它们为什么是这样的关系. 我们最原始的代码思维是把所有的实现都放在一个类中,功能虽然是实现了,但耦合性非常高,很不方便维护,好比活字印刷术之前的印刷,一个地方需要修改,

设计模式-简单工厂(Demo)

简介 工厂都是创建型模式.用来NEW类的.本文章用一个故事讲述了简单工厂模式 故事 在遥远的未来.chenchen我生活条件不错.但是每天都要做饭.chenchen很懒.只想吃.不想干.所以就请了个女仆给chenchen做饭吃.女仆很牛.chenchen只要说.我要吃牛排.不一会.牛排就做好了放在桌子上.我又说还要红酒.女仆开好红酒.倒好放在桌子上.美滋滋的哈!小肉吃着.小酒喝着.美女陪着此等逍遥快活! 是什么? 代替客户端NEW类.客户端与多个类解耦 为什么要用? 上述故事.因为我做很多饭.要

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

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

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.下面是简单工厂UML模型: 那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明: 就拿登录功能来说,假如应用系统需要支持多种登录方式如:手机认证.邮箱认证.用户名登录.那么自然的做法就是建立一个各种登录方式都适用的接口. 定义登录接口: package com.simple.factory; /** * 登录接口 * */ pu

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

跟着ZHONGHuan学习设计模式--简单工厂

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern 跟着ZHONGHuan学习设计模式 简单工厂 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.   类图: 从

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s

PHP经典设计模式--简单工厂模式

PHP经典设计模式--简单工厂模式 pfinal介绍 本来我们要获取一个类的实例,需要用到new关键字.但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方. 工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例. 实现 SimpleFactory.php <?php namespace DesignPatterns