工厂方法模式

工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象。

工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类。

工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码。

使用场景

1.编译时无法准确预期要创建的对象的类;

2.类想让其子类决定在运行时创见什么;

3.类有若干辅助类为其子类,而你想返回那个子类这一信息局部化。

举个最简单的例子,NSNumber这个类,可以使用[[NSNumber alloc] init]来创建实例,但是并没有什么用,除非使用预先定义的工厂方法才有用,

例如:[NSNumber numberWithBool:YES]消息会得到NSNumber的子类NSCFBoolean的一个实例。

创建对象的安全方法

因为客户端并不需要创建对象的实现细节,细节都会在工厂方法中得到实现,并且返回最终的产品,如果想要添加新的产品,不需要修改客户端接口,只需要修改工厂方法即可。

对象工厂方法和类工厂方法

个人觉得类工厂方法其实就是简单工厂的一种体现,只需要调用不同的方法或者传递不同的参数来实例化不同的子类。但是这种方法每次添加新产品时都要在抽象类中添加对应的方法,并不符合开放封闭原则,对象工厂方法模式只需要添加新的类就可以实现我们想要的效果。

Demo

内容比较多:

工厂类

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Factory : NSObject
  4.  
  5. -(id)createProduct;
  6.  
  7. @end
  8.  
  9. #import "Factory.h"
  10. #import "Product.h"
  11. @implementation Factory
  12.  
  13. -(id)createProduct{
  14. return [[Product class] new];
  15. }
  16.  
  17. @end
  1. #import "Factory.h"
  2.  
  3. @interface FactoryType1 : Factory
  4.  
  5. @end
  6.  
  7. #import "FactoryType1.h"
  8. #import "ProductType1.h"
  9. @implementation FactoryType1
  10.  
  11. -(id)createProduct{
  12. return [[ProductType1 class] new];
  13. }
  14.  
  15. @end
  16.  
  17. #import "Factory.h"
  18.  
  19. @interface FactoryType2 : Factory
  20.  
  21. @end
  22.  
  23. #import "FactoryType2.h"
  24. #import "ProductType2.h"
  25.  
  26. @implementation FactoryType2
  27.  
  28. -(id)createProduct{
  29. return [[ProductType2 class] new];
  30. }
  31.  
  32. @end

产品类

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Product : NSObject
  4.  
  5. @property(nonatomic, strong) NSString *name;
  6.  
  7. @end
  8.  
  9. #import "Product.h"
  10.  
  11. @implementation Product
  12.  
  13. -(id)init{
  14. if(self){
  15. _name = @"product";
  16. }
  17. return self;
  18. }
  19.  
  20. @end
  21.  
  22. #import "Product.h"
  23.  
  24. @interface ProductType1 : Product
  25.  
  26. @end
  27.  
  28. #import "ProductType1.h"
  29.  
  30. @implementation ProductType1
  31.  
  32. -(id)init{
  33. if(self){
  34. self.name = @"productType1";
  35. }
  36. return self;
  37. }
  38.  
  39. @end
  40.  
  41. #import "Product.h"
  42.  
  43. @interface ProductType2 : Product
  44.  
  45. @end
  46.  
  47. #import "ProductType2.h"
  48.  
  49. @implementation ProductType2
  50.  
  51. -(id)init{
  52. if(self){
  53. self.name = @"productType2";
  54. }
  55. return self;
  56. }
  57.  
  58. @end

客户端:

  1. Factory *factory1 = [FactoryType1 new];
  2. Product *product1 = [factory1 createProduct];
  3. NSLog(@"%@",product1.name);
  4.  
  5. Factory *factory2 = [FactoryType2 new];
  6. Product *product2 = [factory2 createProduct];
  7. NSLog(@"%@",product2.name);
  8. return ;
  9. /*
  10. *2015-07-19 22:11:13.590 Factory Methods[32054:8351400] productType1
  11. *2015-07-19 22:11:13.591 Factory Methods[32054:8351400] productType2
  12. */

可以看到,打印结果,我们只改变了初始化子类,对应就产生出了不同的产品。

对于类工厂方法就不做演示了,可以参看NSNumber

Objective-C设计模式——工厂方法模式virtual constructor(对象创建)的更多相关文章

  1. Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)

    工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ...

  2. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  4. 我的Java设计模式-工厂方法模式

    女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...

  5. javascript设计模式-工厂方法模式

    工厂方法模式笔记  通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例  对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在  通过工厂方法模 ...

  6. 设计模式-工厂方法模式(FactoryMethod)

    工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...

  7. 深入浅出设计模式——工厂方法模式(Factory Method)

    介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...

  8. 设计模式——工厂方法模式(Factory Method)

    原文地址:http://www.cnblogs.com/Bobby0322/p/4179921.html 介绍 在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计 ...

  9. JAVA设计模式--工厂方法模式

    工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...

随机推荐

  1. UVA 12904 Load Balancing 暴力

    Load Balancing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...

  2. Linux文件空洞与稀疏文件 转

      1.Linux文件空洞与稀疏文件 2.文件系统数据存储 3.文件系统调试   文件空洞   在UNIX文件操作中,文件位移量可以大于文件的当前长度在这种情况下,对该文件的下一次写将延长该文件,并在 ...

  3. SQL Sever 2008 数据库文件的备份和还原

    数据库文件备份保存的方式我知道的有两种,第一种就是我们知道到的简单的分离,生成.mdf和.ldf文件,然后使用的时候直接进行附加数据库就可以了. 那么还有生成备份的文件.bak 的,这个操作要在步骤: ...

  4. 基于css3的文字3D翻转特效

    一款基于css3的文字3D翻转特效.这款特效当鼠标经过文字的时候3D翻转显示阴影.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="compo ...

  5. Robot Framework简介

    概述 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储. 通过测试库中实现的关键字驱动被测软件.Robot Fra ...

  6. 【优先队列】HDU 1873——看病找医生

    来源:点击打开链接 看路径记录的BFS之前,再看一遍优先队列的用法. 优先队列的排序规则可以用运算符重载的方式完成,通常意义下,应该用friend bool operator <进行重载. #i ...

  7. php.ini的配置

    一.user_agent ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)') user_agent,再 ...

  8. java 数组初始化

    一维数组 1)   int[] a;   //声明,没有初始化 2)   int[] a=new int[5];   //初始化为默认值,int型为0 3)   int[] a={1,2,3,4,5} ...

  9. Java再学习——sleep(), wait(), notify(), notifyAll()

    首先一点就是Thread.sleep(long millis)方法是Thread类的静态方法,其他三个wait(), notify()和notifyAll()都是Object类的方法. sleep(l ...

  10. View Controller 视图管理总结

    View controller是iOS中顶层的视图载体和控制器,它需要对view负责,管理view的生命周期,相关处室话以及交互事件,除此以外还需要为view提供合适的数据,以供view使用. Vie ...