iOS设计模式-工厂方法
2016-02-19 17:09
211 查看
工厂方法
工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。工厂方法的使用场景
编译时无法准确预期要创建的对象的类;类想让子类决定在运行时创建什么;
类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部话;
工厂方法在CocoaTouch中的应用
在Objective-C中两步对象创建法[[SomeClass alloc] init].但是还有一些便利的创建方法。例如,NSNumber有很多numberWith*方法;其中有两个是numberWithBool:和numberWithChar:。它们是类方法,也就是说我们向NSNumber发送[[NSNumber numberWithBool:bool]]与[[NSNumber numberWithChar:char]],以获得与传入参数同类型的各种NSNumber实例。与如何创建NSNumber的具体子类型的实例有关的细节,都有NSNumber的类工厂方法负责。[[NSNumbernumberWithBool:bool]]的情况是,方法接受值bool,并把NSNumber的内部子类的一个实例初始化,让它能够反应传入的值。
工厂方法在Objective-C中的实现
1、定义通过工厂方法创建的类的统一父类(例如:Animal)和通过工厂方法创建的各个类(例如:Dog、Cat等),并为各个子类提供初始化细节。<code class="language-C hljs r has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">//通过工厂方法创建类的实现举例 - (id)initWithName:(NSString*)name{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(self = [super init]){ self.name = name; //添加初始化相关细节 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> self; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
2、定义生成器父类(例如:AnimalGenerator)和各个生成器子类(例如:DogGenerator、CarGenerator)。
3、生成器父类中创建工厂方法、各个生成器子类中重载该方法
<code class="language-C hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//AnimalGenerator中工厂方法</span> - (Animla*)animalWithName:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span>*)name{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [[Animal alloc] initWithName:name]; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//DogGenerator对AnimalGenerator中工厂方法的重载</span> - (Animal*)animalWithName:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span>*)name{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [[Dog alloc] initWitName:name]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
4、使用
<code class="language-C hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">DogGenerator *dogGenerator = [[DogGenerator alloc] init]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//不同生成器创建不同的动物</span> Animal *dog = [[dogGenerator animalWithName:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">@"小七"</span>]];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
相关文章推荐
- 解决Xcode7.1上传成功但iTunesconnect一直不能构建版本的问题
- iOS9适配
- iOS开发中的几种设计模式介绍
- iOS中延时执行方法的比较和汇总
- IOS第四天_面向对象2
- ios开发之itunes打包流程
- IOS沙盒路径
- iOS开发:设计模式那点事
- IOS 四种保存数据的方式
- iOS启动图和icon尺寸
- 苹果的“黑魔法”Method Swizzling
- IoGetCurrentIrpStackLocation和IoSkipCurrentIrpStackLocation和IoCopyCurrentIrpStackLocationToNext
- iOS 快速遍历 效率分析 for loop for in enumerateBlock 适用条件
- iOS7 打开相机代码
- iOS系统越狱检测
- 越狱检测的攻与防
- iOS的断点调试
- iOS应用程序测试打包
- iOS 实现摇一摇功能
- IOS 信息提示2