本文为原创,欢迎转载和收藏,转载请标明原文地址


程序中可能会出现大量的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中的反射和反射工厂相关推荐

  1. java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC

    ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...

  2. java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  3. Java反射机制与工厂模式

    工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直接new没有什么不好,只是工厂模式可以给系统带来更好 ...

  4. Java中为什么需要反射?反射要解决什么问题?

    Java中为什么需要反射?反射要解决什么问题? 参考文章: (1)Java中为什么需要反射?反射要解决什么问题? (2)https://www.cnblogs.com/buoge/p/9285142. ...

  5. 依赖注入底层反射原理_Spring中反射与反射的原理(转载)

    Spring 中的反射与反射的原理 | Depp Wang's Blog 在造轮子:实现一个简易的 Spring IoC 容器一文中提到 Spring 在创建 Bean 实例和依赖注入时使用了反射,本 ...

  6. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...

    如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...

  7. JAVA中的糕富帅技术——反射(一)

    前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂 ...

  8. java为什么要用反射_Java中为什么需要反射?反射要解决什么问题?

    一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...

  9. java注解和反射原理_Java中的注解和反射

    最近又回顾了一下 Java 中的注解和反射知识点,注解在日常开发中使用很多,但是反射比较少.值得注意的是 Java 的各种框架底层源码中大量使用了注解和反射,阅读源码,这些是基本功,面试中这部分内容也 ...

最新文章

  1. 常用巡检语句(oracle)
  2. jQuery的过滤遍历
  3. OpenGL 投光物Light casters
  4. JS中数据结构之队列
  5. 字符串匹配,KMP算法
  6. jep290涉及jdk版本_JDK 13中的JEP 355文本块
  7. DNS高可用设计--软件高可用
  8. 运维人员如何最大限度避免误删除文件
  9. php 循环获取分类,PHP 循环删除无限分类子节点
  10. Why do people love certain websites and web products?
  11. wordpress字体_如何在WordPress中使用网络字体
  12. 工业交换机在智能交通电子警察系统解决方案的应用
  13. 网络安全笔记5——数字签名
  14. Mybatis复杂查询(详细举例)
  15. [CF1526B] I Hate 1111(数学)
  16. 戴尔910服务器系统安装教程,图解戴尔dell工作站T3600/T5600/T7600/T7910安装windows 7系统...
  17. 0xc0000142应用程序无法正常启动
  18. 里程碑图、横道图、项目进度网络图比较
  19. 1VB编程技术的简介
  20. 助力传统游戏转型GameFi,Web3Games推动游戏发展新航向

热门文章

  1. eclipse检测不到android的手机
  2. TriCore处理器的上下文切换原理
  3. Spark源码分析之SchedulerBackend分析
  4. (80)FPGA面试题-请画出序列“1101 “检测状态转移图
  5. (11)FPGA跨时钟域处理(第3天)
  6. (73)FPGA模块调用(VHDL调用system Verilog)
  7. (19)FPGA乒乓操作
  8. Vivado过程文件解释
  9. 计算机内存只认4,为什么电脑的8GB内存只有7.45GB可用?
  10. 【C语言】关键字volatile之有关__IO、__O、__I的故事