iOS:个人浅谈工厂模式
一、什么是工厂方法?
正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了开放封闭原则。工厂方法也叫做虚构造器(Virtual Constructor)。
个人的拙见是:通过工厂方法创建工厂对象,然后在工厂类中定义创建基类的子类对象的方法并通过外部传入的条件判断去创建哪一个子类对象,不过由于OC是运行时语言,所以工厂类虽然提供了创建子类对象的方法,但是在编译时期并不能确定对象类型,编译时期创建的子类对象类型是基类类型,真正的类型在运行时期由子类来确定,也即此时确定为子类类型。
二、工厂方法的实现条件?
(1)存在继承关系
(2)运用了多态的特性
三、工厂方法的优缺点?
优点:极大地优化了代码,如果需要100个子类对象,不用再一直调用alloc方法去创建,而是直接通过其工厂类的一句代码即可实现,提高了对代码的复用性。同时,也可以将大量的操作放到工厂类中去处理,业务类中只负责去调用创建需要的对象即可。
缺点:因为它的实现条件之一必须存在继承关系,所以模式中工厂类集中了所有的创建逻辑,形成一个庞大的全能类,当所有的类不是继承自同一个父类的时候扩展比较困难。
四、创建一个简单的工厂方法如下
工厂类:PersonFactory
// PersonFactory.h // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import <Foundation/Foundation.h>extern NSString *TeacherClassName; extern NSString *StudentClassName;@class Person; @interface PersonFactory : NSObject/*** 定义的一个创建子类对象的接口,通过传入的类名称创建对应的子类对象** @param className 类名称* @param callBlcok 回调,返回创建的子类对象,此时接收子类对象的类型Person类型*/ -(void)createObject:(NSString *)className compelete:(void (^)(Person *object))callBlcok;@end
// PersonFactory // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import "PersonFactory.h" #import "Person.h" #import "Teacher.h" #import "Student.h"NSString *TeacherClassName = @"Teacher"; NSString *StudentClassName = @"Student";@implementation PersonFactory-(void)createObject:(NSString *)className compelete:(void (^)(Person *object))callBlcok{if ([className isEqualToString:NSStringFromClass([Teacher class])]) {//创建教师类对象Teacher *teacher = [[Teacher alloc] init];//回调 callBlcok(teacher);//教书 [teacher teachStudent];}if ([className isEqualToString:NSStringFromClass([Student class])]) {//创建学生类的对象Student *student = [[Student alloc] init];//回调 callBlcok(student);//学习 [student learnKnowledge];} }@end
基类:Person(里面提供的方法都被子类重写)
// Person.h // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import <Foundation/Foundation.h>@interface Person : NSObject/*** 打印类名*/ -(void)printClassName;@end
// // Person.m // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import "Person.h"@implementation Person-(void)printClassName{}@end
子类教师类:Teacher(重写基类方法的同时,也可以定义属于自己的新的方法)
// Teacher.h // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import "Person.h"@interface Teacher : Person/*** 教师的行为*/ -(void)teachStudent; @end
// Teacher.m // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import "Teacher.h"@implementation Teacher-(void)printClassName{NSLog(@"%@---%@",NSStringFromClass([self class]),self); }-(void)teachStudent{NSLog(@"teach student"); }@end
子类学生类:Student(重写基类方法的同时,也可以定义属于自己的新的方法)
// Student.h // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import "Person.h"@interface Student : Person/*** 学生的行为*/ -(void)learnKnowledge;@end
// Student.m // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import "Student.h"@implementation Student-(void)printClassName{NSLog(@"%@---%@",NSStringFromClass([self class]),self); }-(void)learnKnowledge{NSLog(@"learnKnowledge"); }@end
main.m演示如下:
// main.m // PersonFactory // // Created by 夏远全 on 16/12/23. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. // #import <Foundation/Foundation.h> #import "PersonFactory.h" #import "Person.h" #import "Teacher.h" #import "Student.h"int main(int argc, const char * argv[]) {@autoreleasepool {//创建工厂对象PersonFactory *personFactory = [[PersonFactory alloc] init];//连续创建Person的子类教师类对象for (int i=0; i<5; i++) {[personFactory createObject:TeacherClassName compelete:^(Person *object) {[object printClassName];}];}//连续创建Person的子类学生类对象for (int i=0; i<5; i++) {[personFactory createObject:StudentClassName compelete:^(Person *object) {[object printClassName];}];}}return 0; }
打印结果:
2016-12-23 21:58:51.235 PersonFactory[8896:442793] Teacher---<Teacher: 0x100f01660> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x103800100> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x100c005c0> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x100c00550> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x100c00180> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x100a00020> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x100a02880> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x103900000> 2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge 2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x103800220> 2016-12-23 21:58:51.238 PersonFactory[8896:442793] learnKnowledge 2016-12-23 21:58:51.238 PersonFactory[8896:442793] Student---<Student: 0x103800230> 2016-12-23 21:58:51.238 PersonFactory[8896:442793] learnKnowledge Program ended with exit code: 0
本人原创,此处是自己对知识的回炉,如果理解有误,请大家不吝赐教,对我进行斧正。
iOS:个人浅谈工厂模式相关推荐
- 为什么工厂模式是华而不实的——浅谈工厂模式的利与弊
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17428923 说明:博主虚心接受大家的抨击,批评,指正 前言 我一直想介绍下 ...
- 为什么工厂模式是华而不实的—浅谈工厂模式的利与弊
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17428923 说明:博主虚心接受大家的抨击,批评,指正 前言 我一直想介绍下 ...
- 【转】从Mac/OS和iOS开放源码浅谈UNIX家谱
[转]从Mac/OS和iOS开放源码浅谈UNIX家谱 阅读数:1245 苹果公司在各类开源项目中长期贡献着自己的力量,但其UNIX系统技术一直都属于闭源阵营(这一点可以从NUX OS阵营和家谱图中得到 ...
- 浅谈工厂设计--java必备技能
浅谈工厂设计–java必备技能 说到工厂,我就联想到了亚洲的大工厂富士康–接过订单然后按照固定的模板生产商品,其实java中工厂类中的工厂方法也是一样,接过参数,根据参数来生产需要的商品: 今天我们一 ...
- 浅谈工厂和建造者模式
最近在写安卓项目,在引入rxJava和Retrofit发现大量引用的建造者模式.那在此就记录和简单介绍一下两者的区别和使用方法. 工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象. 1. ...
- 浅谈软件研发模式中瀑布模型、迭代模型、敏捷模型
要比较模型的区别,首先说说什么叫软件开发.软件开发是一项包括版本计划.需求捕捉.需求分析.设计到代码编写.调试.维护的一系列过程.软件开发不仅仅是编程.而对于软件研发(Reserch and Deve ...
- 浅谈 Facade 模式
Facade 模式 所谓 Facade 模式,是一个可以让事情变得有点头绪的好东西. 一个 Facade 肯定是一位某方面的"行家",例如数据库操作.它对来自上层的请求屏蔽了具体的 ...
- iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能, ...
- 浅谈严格模式和混杂模式
一,严格模式和混杂模式的定义: 通俗来说: 严格模式是浏览器根据w3c的规范来解析代码: 混杂模式是浏览器根据自己的规范来解析代码(很明显:无规矩不成方圆,这种混杂模式会产生一些浏览器兼容问题). 二 ...
最新文章
- 阿里提出电商搜索全局排序方法,淘宝无线主搜GMV提升5%
- 7.4.1 矩阵低秩近似、矩阵范数
- Hyhyhy – 专业的 HTML5 演示文稿工具
- Shanghai Barcamp
- 记录一次安恒信息面试过程
- 【Machine Learning 二】单变量线性回归,代价函数,梯度下降
- python循环定义变量_Python变量和循环
- 为什么被喷的总是产品经理?
- velocity include
- 基于微信小程序的透析耗材管理系统
- 天空盒(SkyBox)的实现原理与细节
- 华为U2000网管研究实录 (1) - 安装
- coffe的前端界面图(css+html)
- win10更改user用户名(win10更改user用户名文件夹已在另一个文件中已打开)
- [WebSocket]使用WebSocket实现实时多人答题对战游戏
- 梦幻星空html,HTML5特效展示,梦幻星空
- 使用Sivarc使PLC程序标准化
- 【云原生 | 44】Docker搭建Registry私有仓库之管理访问权限
- 欧洲杯第五周的比赛闲聊
- My97 DatePicker图标触发
热门文章
- 固态函数不正确_一文解读quot;固态电容quot;的利与弊
- java推送Comet_使用Comet4j实现消息推送
- 如何下载多段ts视频 m3u8 ffmpeg
- python 画线条进行到指定区域更改颜色,使用Colormaps在matplotlib中设置线条的颜色...
- 信息安全学习路线图_Python学习图谱:学习到困惑的时候可以参考的图谱
- js 条码枪扫描_年会展台 精彩不断 | 沧田:从打印到扫描录入 国产品牌从未停止...
- 妖帝q群机器人_有关酷Q 晨风机器人,契约 qqlite qqlight ,mypc等QQ机器人关停一事的一点想法...
- python换源还是不行_浅析Python3 pip换源问题
- curd什么意思中文_查英英字典:What a shame是什么意思?
- java数组有跨类建立对象_Java性能优化的45个细节(珍藏版)