iOS设计模式:静态工厂相关
工厂方法模式
定义创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类.
*最初的定义出现于<设计模式>(Addison-Wesley,1994)
注意:我讲解的是静态工厂,它只能执行静态的方法,也就是类方法,似乎与工厂方法有些神识但也有区别.
先准备一个基类的数据模型
BaseModel.h + BaseModel.m
#import <Foundation/Foundation.h> // 基类数据模型,为派生出的子类定义统一的接口(该基类所有的实现都为空实现)
@interface BaseModel : NSObject + (void)modelInfo; @end
#import "BaseModel.h" @implementation BaseModel + (void)modelInfo
{
NSLog(@"BaseModel");
} @end
用两个类分别继承至该基类
NameModel.h + NameModel.m
#import "BaseModel.h" @interface NameModel : BaseModel + (void)modelInfo; @end
#import "NameModel.h" @implementation NameModel + (void)modelInfo
{
if (self == [NameModel class])
{
NSLog(@"NameModel");
}
} @end
NewsModel.h + NewsModel.m
#import "BaseModel.h" @interface NewsModel : BaseModel + (void)modelInfo; @end
#import "NewsModel.h" @implementation NewsModel + (void)modelInfo
{
if (self == [NewsModel class])
{
NSLog(@"NewsModel");
}
} @end
注意,这两个基类都重载了父类中的方法modelInfo
之后就来定义我们的工厂类了
ModelFactory.h + ModelFactory.m
#import <Foundation/Foundation.h> @interface ModelFactory : NSObject + (Class)classWithModel:(id)model; @end
#import "ModelFactory.h" #import "BaseModel.h"
#import "NameModel.h"
#import "NewsModel.h" @implementation ModelFactory + (Class)classWithModel:(id)model
{
Class modelClass = Nil; if ([model isKindOfClass:[NameModel class]])
{
modelClass = [NameModel class];
}
else if ([model isKindOfClass:[NewsModel class]])
{
modelClass = [NewsModel class];
}
else if ([model isKindOfClass:[BaseModel class]])
{
modelClass = [BaseModel class];
} return modelClass;
} @end
这样,一份完整的静态工厂相关的设计就出来了,不过这个静态工厂不是用来创建对象的,而是来识别对象的.

用途:
客户端(使用你封装代码的人)不关心你的基类到底派生出了多少种子类,它只关心,特定的子类返回特定的样式,知道这些就够了.他只会用这个基类指针从工厂中获取想要的东西,而你就必须得在工厂中去处理这些东西.客户端无需更改什么代码,一切的代码都在工厂中处理,客户端是不关心的.
注意细节:
1. 基类需要定义一些方法(公共的类方法接口)并空实现,子类继承之后按需要重载实现这些公共的接口,不实现也行.
2. 工厂中集中识别这些继承的对象,匹配出对象后返回想要的结果.
3. 添加了新的子类后需要更新工厂.
iOS设计模式:静态工厂相关的更多相关文章
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
- Java设计模式———静态工厂
上课时yqj2065要求:除了JDK等框架或工具中的类,自己编写的类不得使用new创建对象(Test除外). 据说是因为使用new会涉及到硬编码.(不是很懂) 所以要求用God类利用反射+配置文件来创 ...
- Yii2设计模式——静态工厂模式
应用举例 yii\db\ActiveRecord //获取 Connection 实例 public static function getDb() { return Yii::$app->ge ...
- Yii2 设计模式——静态工厂模式
应用举例 yii\db\ActiveRecord //获取 Connection 实例 public static function getDb() { return Yii::$app->ge ...
- 设计模式--静态工厂设计模式在android中的使用
今天看到这篇文章:http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html public c ...
- java的设计模式 - 静态工厂方法
静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.va ...
- iOS设计模式之工厂方法模式
工厂方法模式 基本理解 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂的最大优点就是工厂类中包含了必要的逻辑判断,根据客户端的选择 ...
- IOS设计模式-抽象工厂
抽象工厂的灵活性要比简单工程的灵活性强. 抽象工厂的UML图(第一次画UML图,可能关系和箭头的图意义有错误,但是请不要以建模规范去看图,以最基本的结合后面OC代码,理解相关关系): 抽象工厂原理:抽 ...
- IOS设计模式-简单工厂
为什么 “简单工厂原理” 叫简单工厂,因为这个工厂类不是抽象类,而是实体类,工厂本身就是一个具体的对象. 写一个例子演示简单工厂模式: >>>>>>>> ...
随机推荐
- PHP任意文件上传漏洞CVE-2015-2348浅析
昨晚安全新闻爆出一个“PHP任意文件上传漏洞”,CVE编号为:CVE-2015-2348. 当时楼主正准备收拾东西回家,看到这个新闻心里一惊:失传江湖多年的0字符截断上传漏洞又重现了?而且还影响这么多 ...
- Linux 基础——关机重启命令shutdown、reboot等
一.关机重启命令的作用 相信对于接触过电脑的人来说,特别是对于windows系统来说,如果长时间使用不经重启的话会出现一点点卡顿的感觉.但是当重启整个系统后,这点点卡顿的感觉好像又没了,重启后wind ...
- 并发queue
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue. 一.Con ...
- android开发笔记,杂
Mapping文件地址: mapping文件用于在代码被混淆后,还原BUG信息. release模式编译项目即可产生,相对位置:工程\build\outputs\mapping\release 需要c ...
- jvisualvm 远程连接jboss
由于项目中使用jboss 作为web容器,每当项目上线时需要使用loadrunner对项目进行性能压测,这时就需要实时观察JVM的一些参数.想使用jvisualvm借助jstatd远程连接服务器上面的 ...
- ubuntu 系统提示升级失败,boot空间不足
系统提示升级失败,boot空间不足,解决方法: linux 随着系统的升级,会自动攒下好几个内核 执行 uname -a 看下自己当前启动的是哪个内核 dpkg --get-selections |g ...
- ASP.NET MVC 3和Razor中的@helper
ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通 ...
- thinkphp5.0Traits引入
ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题. Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制.Trai ...
- python 2 如何安装 MySQL 数据库操作库
我试了好几种网上的办法,在 windows 10 VS2017 环境下不是缺了头文件,就是缺 .lib,反正十分繁琐,以后我也懒得搞了,都用 annaconda 来搞定就好了,时间宝贵. 在 控制台中 ...
- cogs——2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...