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设计模式-简单工厂
为什么 “简单工厂原理” 叫简单工厂,因为这个工厂类不是抽象类,而是实体类,工厂本身就是一个具体的对象. 写一个例子演示简单工厂模式: >>>>>>>> ...
随机推荐
- 20165301 预备作业三:Linux安装及命令入门
预备作业三:Linux安装及命令入门 VirtualBox虚拟机的安装 在进行安装之前,原本以为有了娄老师的安装教程会是一件很容易的事情.万万没想到,在自己实际动手操作中,还是遇到了许多困难.通过与同 ...
- xcode没有ios7的模拟器
xcode7 目前只支持 ios8盒和iOS9的模拟器如果是Yosemite系统,下载xcode7和xcode6.4,两个版本可以共存,然后再下载iOS7默契你如果是EI Caption系统,网上说E ...
- MYSQL-----控制流程函数(case when...then..else..end)
MySQL有一些内置的控制流程函数,可以在SQL语句中使用这些函数来更加准确和直接的结果. 第一种语法: case when [value] then result ................. ...
- Python写网络爬虫爬取腾讯新闻内容
最近学了一段时间的Python,想写个爬虫,去网上找了找,然后参考了一下自己写了一个爬取给定页面的爬虫. Python的第三方库特别强大,提供了两个比较强大的库,一个requests, 另外一个Bea ...
- Good Bye 2014 F - New Year Shopping
F - New Year Shopping 对于一种特殊的不可逆的dp的拆分方法.. 也可以用分治写哒. #include<bits/stdc++.h> #define LL long l ...
- http请求,HttpClient,调用短信接口
项目中安全设置找回密码的功能,需要通过发送短信验证绑定手机,通过绑定的手机号验证并重新设置密码. 因为项目是通过maven管理的,所以需要在pom.xml文件中引入jar包, maven引入的jar包 ...
- Boolean Expressions POJ - 2106 (表达式求值)
The objective of the program you are going to produce is to evaluate boolean expressions as the one ...
- EventBus机制 handler 区别
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 事件巴士 是 采用 观察者模式 实现 事件订阅总线, 可以用在 应用程序中, 组件之间, ...
- 常用数据库validationQuery检查语句
数据库 validationQuery Oracle select 1 from dual DB2 select 1 from sysibm.sysdummy1 mysql select 1 mi ...
- java高并发程序设计模式-并发级别:阻塞、无障碍、无锁、无等待【转载】
一般认为并发可以分为阻塞与非阻塞,对于非阻塞可以进一步细分为无障碍.无锁.无等待,下面就对这几个并发级别,作一些简单的介绍. 1.阻塞 阻塞是指一个线程进入临界区后,其它线程就必须在临界区外等待,待进 ...