Objective-C中的反射和反射工厂
本文为原创,欢迎转载和收藏,转载请标明原文地址
程序中可能会出现大量的if-else或者switch-case来选择一系列类中的某个类进行操作,利用反射(Reflection)就可以避免这些重复判断工作。
反射在Java中封装了类来实现,在Objective-C里面要自己来实现,好在不是很难。
我们的目的是通过传入一个类名字符串,把字符串类名动态转化成类,并对类进行实例化和调用方法等操作。
OC的NSRuntime中提供了将Class name转化为Class的方法"NSClassFromString()"
NSClassFromString //方法原型 Class NSClassFromString (NSString *aClassName );
因此,我们就可以这样使用来动态获得一个类:
NSString * aClassName = @"SunnyClass"; Class class = NSClassFromString(aClassName);
这样我们就能实例化这个类了:
id instance = [[class alloc] init];
如果需要使用方法,最好用reponseToSelector:来检测一下
if([instance reponseToSelector:@selector(aMethod)]) {[instance aMethod]; }
这样就完成了反射调用的过程。
下面就是将反射利用到工厂模式里。
定义一个Fruit,和三种继承自Fruit的水果
@interface Fruit : NSObject - (void)show; @end@interface Apple : Fruit @end@interface Banana : Fruit @end@interface Pear : Fruit @end
实现部分,简单的show方法来打印
@implementation Fruit - (void)show {NSLog(@"I'm a fruit"); } @end@implementation Apple - (void)show {NSLog(@"I'm an apple"); } @end@implementation Banana - (void)show {NSLog(@"I'm a banana"); } @end@implementation Pear - (void)show {NSLog(@"I'm a pear"); } @end
如果使用传统的if-else分支判断的话,情况就会变得非常恶心,如果想再增加一个Orange类的话,不仅需要增加Orange类的代码,工厂的代码也要新增加else-if分支:
- (Fruit *)createFruitWithName:(NSString *)fruitName {Fruit * theFruit;if ([fruitName isEqualToString:@"Apple"]) {theFruit = [[[Apple alloc] init] autorelease];}else if ([fruitName isEqualToString:@"Banana"]){theFruit = [[[Banana alloc] init] autorelease];}else if ([fruitName isEqualToString:@"Pear"]){theFruit = [[[Pear alloc] init] autorelease];}return theFruit; }
但如果使用反射工厂的模式,情况就变得简单了许多,扩展性也会变得更好(反射输入的类名最好能来自于一个文件,这个文件规定了哪些字符串是可以作为参数传入的,这里就不考虑了)
@implementation FruitFactroy- (Fruit *)createFruitWithName:(NSString *)fruitName {//通过string得到类的结构体Class class = NSClassFromString(fruitName);//通过转化的class得到实例对象Fruit * theFruit = [(Fruit *)[[class alloc] init] autorelease];//调用对象方法if ([theFruit respondsToSelector:@selector(show)]) {[theFruit show];}//返回对象return theFruit; } @end
工厂方法的调用
FruitFactroy * factroy = [[[FruitFactroy alloc] init] autorelease];Fruit * apple = [factroy createFruitWithName:@"Apple"];Fruit * banana = [factroy createFruitWithName:@"Banana"];Fruit * pear = [factroy createFruitWithName:@"Pear"];
转载于:https://www.cnblogs.com/sunnyxx/archive/2012/04/27/2473146.html
Objective-C中的反射和反射工厂相关推荐
- java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC
ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...
- java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- Java反射机制与工厂模式
工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直接new没有什么不好,只是工厂模式可以给系统带来更好 ...
- Java中为什么需要反射?反射要解决什么问题?
Java中为什么需要反射?反射要解决什么问题? 参考文章: (1)Java中为什么需要反射?反射要解决什么问题? (2)https://www.cnblogs.com/buoge/p/9285142. ...
- 依赖注入底层反射原理_Spring中反射与反射的原理(转载)
Spring 中的反射与反射的原理 | Depp Wang's Blog 在造轮子:实现一个简易的 Spring IoC 容器一文中提到 Spring 在创建 Bean 实例和依赖注入时使用了反射,本 ...
- java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...
如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...
- JAVA中的糕富帅技术——反射(一)
前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂 ...
- java为什么要用反射_Java中为什么需要反射?反射要解决什么问题?
一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...
- java注解和反射原理_Java中的注解和反射
最近又回顾了一下 Java 中的注解和反射知识点,注解在日常开发中使用很多,但是反射比较少.值得注意的是 Java 的各种框架底层源码中大量使用了注解和反射,阅读源码,这些是基本功,面试中这部分内容也 ...
最新文章
- 常用巡检语句(oracle)
- jQuery的过滤遍历
- OpenGL 投光物Light casters
- JS中数据结构之队列
- 字符串匹配,KMP算法
- jep290涉及jdk版本_JDK 13中的JEP 355文本块
- DNS高可用设计--软件高可用
- 运维人员如何最大限度避免误删除文件
- php 循环获取分类,PHP 循环删除无限分类子节点
- Why do people love certain websites and web products?
- wordpress字体_如何在WordPress中使用网络字体
- 工业交换机在智能交通电子警察系统解决方案的应用
- 网络安全笔记5——数字签名
- Mybatis复杂查询(详细举例)
- [CF1526B] I Hate 1111(数学)
- 戴尔910服务器系统安装教程,图解戴尔dell工作站T3600/T5600/T7600/T7910安装windows 7系统...
- 0xc0000142应用程序无法正常启动
- 里程碑图、横道图、项目进度网络图比较
- 1VB编程技术的简介
- 助力传统游戏转型GameFi,Web3Games推动游戏发展新航向
热门文章
- eclipse检测不到android的手机
- TriCore处理器的上下文切换原理
- Spark源码分析之SchedulerBackend分析
- (80)FPGA面试题-请画出序列“1101 “检测状态转移图
- (11)FPGA跨时钟域处理(第3天)
- (73)FPGA模块调用(VHDL调用system Verilog)
- (19)FPGA乒乓操作
- Vivado过程文件解释
- 计算机内存只认4,为什么电脑的8GB内存只有7.45GB可用?
- 【C语言】关键字volatile之有关__IO、__O、__I的故事