文档章节

【iOS编程思想】工厂模式

魔笛GNR
 魔笛GNR
发布于 2016/07/13 15:21
字数 750
阅读 23
收藏 0
iOS

工厂模式?   

    简而言之,假如有这样一个汽车工厂,不管你需要那种品牌的车,都可以为你生产出来。

好处是啥?

    因为这样做太酷了!

实现这个工厂!

 

首先,定义一个汽车工厂类,取名LYCarFactory:

.h 中的内容:

@interface LYCarFactory : NSObject

//每辆车都遵守这个代理
@property (nonatomic,weak) id<LYCarDelegate> delegate;

//根据 传入品牌 枚举 构建不同的车
+ (LYCarFactory *)carWithBrand:(LYCarBrand)brand;

//给车一个方法,可以让它跑
- (void)run;

//给车几个属性方法,我们可以直达它的价格个品牌
- (double)price;//价格
- (NSString *)brandName;//品牌名

@end

设计一个品牌的枚举:

typedef NS_ENUM(NSInteger,LYCarBrand){
    LYCarBrandFerrari,//法拉利
    LYCarBrandLamborghini,//兰博基尼
    LYCarBrandBMW,//宝马
};

设计一个委托,并且在interface 中遵守这个代理:

@protocol LYCarDelegate <NSObject>
//这个委托 说明了 哪种品牌的车 正在狂奔中...
- (void)running:(Class)cls;

@end

同时在定义这三个品牌的子类(他们的爸爸都是LYCarFactory):

子类会自动继承爸爸的属性、方法及委托协议!

/**
 *  法拉利
 */
@interface LYFerrari : LYCarFactory

@end

/**
 *  兰博基尼
 */
@interface LYLamborghini : LYCarFactory

@end

/**
 *  宝马
 */
@interface LYBMW : LYCarFactory

@end

.m 中:

实现父类的方法:

//根据品牌枚举 生产不同的车
+ (LYCarFactory *)carWithBrand:(LYCarBrand)brand{
    switch (brand) {
        case LYCarBrandFerrari:
            return [[LYFerrari alloc]init];
            break;
        case LYCarBrandLamborghini:
            return [[LYLamborghini alloc]init];
            break;
        case LYCarBrandBMW:
            return [[LYBMW alloc]init];
            break;
        default:
            break;
    }
}

实现父类run函数,并且在此函数中,让代理执行代理方法!

- (void)run{

    NSLog(@"%@ 狂奔中...\n",self.brandName);
    NSLog(@"%.2f 大洋,好便宜啊!!!",self.price);
    
    [_delegate running:[self class]];//执行代理方法
    
}

实现子类方法,因为不同品牌的车有不同的价格和名字:

/**
 *  法拉利
 */
@implementation LYFerrari

- (double)price{
    return 10;
}

- (NSString *)brandName{
    return @"法拉利";
}

@end

/**
 *  兰博基尼
 */
@implementation LYLamborghini

- (double)price{
    return 20;
}

- (NSString *)brandName{
    return @"兰博基尼";
}

@end

/**
 *  宝马
 */
@implementation LYBMW

- (double)price{
    return 30;
}

- (NSString *)brandName{
    return @"宝马";
}

@end

OK,工厂模式设计好了!让它为我们生产一辆法拉利如何?

使用它:

首先创建这个汽车工厂对象:

LYCarFactory * carf = [LYCarFactory carWithBrand:LYCarBrandFerrari];
carf.delegate = self;//别忘了在interface遵守此代理哦
[carf run];//让车跑

实现代理方法,其中我们打印看看这辆车的类型:

- (void)running:(Class)cls{
    NSLog(@"类型: %@",NSStringFromClass(cls));
}

运行它,打印结果如下:

 2016-07-13 15:12:10.166 Test1[8578:238409] 法拉利 狂奔中...

2016-07-13 15:12:10.166 Test1[8578:238409] 10.00 大洋,好便宜啊!!!

2016-07-13 15:12:10.166 Test1[8578:238409] 类型: LYFerrari

我们可以看到,虽然我们外界没有运用LYFerrari 这个子类,但是通过品牌枚举,这个汽车工程依然把法拉利生产出来了!

没错,法拉利,10块大洋,好便宜啊!

Demo Github:

 https://github.com/ly918/Demos

© 著作权归作者所有

魔笛GNR
粉丝 7
博文 82
码字总数 43485
作品 0
郑州
iOS工程师
私信 提问
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
2018/05/26
0
0
移动开发之设计模式- 代理模式(IOS&Android)

资源 完全参照 代理模式|菜鸟教程但不包括IOS代码 代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有...

FlanneryZJ
2018/12/18
0
0
移动开发之设计模式-抽象工厂模式(IOS&Android)

资源 完全参照 抽象工厂模式|菜鸟教程 ,但不包括IOS代码 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型...

FlanneryZJ
2018/12/17
0
0
移动开发之设计模式-工厂模式(IOS&Android)

资源 完全参照 工厂模式|菜鸟教程 ,但不包括IOS代码 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳...

FlanneryZJ
2018/12/17
0
0
【干货】iOS开发学习中不易弄清楚的六种开发模式

在我们的实际开发中,架构模式多多少少也有几十种,在很多模式里,相信很多刚开始接触ios的程序员会遇到这类问题,本文小编就为大家详细解说这6种模式应用场景,帮助大家理清思路,学好ios开...

原来是泽镜啊
2018/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ngrok 外网映射工具

ngrok介绍 许多刚学java web的同学(包括我自己)肯定都非常好奇,如何在外网上访问自己做的项目,跟我们本地访问tomcat有什么区别? 今天就向大家介绍一个非常强大的外网映射工具:ngrok.ngrok可以...

edison_kwok
36分钟前
2
0
Spark Streaming的优化之路——从Receiver到Direct模式

          作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来...

个推
今天
4
0
壮丽70年·奋斗新时代|蒸妙集团熏蒸中会阴熏蒸的神奇好处

聚结相合之处为会。会阴居两阴间,为督、任、冲三脉的起点,三脉背出两阴之间,会聚阴部,因名会阴。会阴,经穴名。出《针灸甲乙经》。会阴别名屏翳、下极、金门。属任脉。在会阴部,男性当阴...

公益传承
今天
2
0
pentaho-kettle-8.2.0.0-R源码开发环境搭建

1.从Kettle官网下载源码,本文使用的是pentaho-kettle-8.2.0.0-R 下载地址:https://codeload.github.com/pentaho/pentaho-kettle/zip/8.2.0.0-R 2.打开eclipse,选择一个新的工作空间,然后设...

gq_2010
今天
1
0
lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部