一 何为工厂方法模式?(what)

定义创建对象的接口,让子类决定实例化哪一个类,工厂方法是的一个类的实例化延迟到其子类。

工厂方法创建的对象拥有一组共同的行为,所以往类层次结构中引入新的具体产品并不需要修改客户端代码。

二 何时使用工厂方法?(where)

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

eg:[NSNumber numberWithBool:YES];工厂方法模式对框架设计者特别有用。

三 实现工厂方法 (how)

CanvasView定义了任意CanvasView类型的默认行为。其子类用不同图像在屏幕上展现各种纹理并展现其他可能的特定行为。

PaperCanvasView:CanvasView

方法:

- (id)initWithFrame:(CGRect)frame

{

  if(self == [super initWithFrame:frame])

  {

    UIImage *backgroundImage = [UIImage imageNamed:@"paper"];

    UIImageView *backgroundView =[[[UIImageView alloc]initWithImage:backgroundImage]autorelease];

    [self addSubview:backgroundView];

  }

  return self;

}

ClothCanvasView:CanvasView

方法:

- (id)initWithFrame:(CGRect)frame

{

  if(self == [super initWithFrame:frame])

  {

    UIImage *backgroundImage = [UIImage imageNamed:@"cloth"];

    UIImageView *backgroundView =[[[UIImageView alloc]initWithImage:backgroundImage]autorelease];

    [self addSubview:backgroundView];

  }

  return self;

}

CanvasViewGenerator生成器默认方法返回舞团的CanvasView

CanvasViewGenerator:NSObject

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame

{

  return [[[CanvasView alloc]initWithFrame:aFrame]autorelease];

}

PaperCanvasViewGenerator:CanvasViewGenerator

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame

{

  return [[[PaperCanvasView alloc]initWithFrame:aFrame]autorelease];

}

ClothCanvasViewGenerator:CanvasViewGenerator

- (CanvasView *)canvasViewWithFrame:(CGRect)aFrame

{

  return [[[ClothCanvasView alloc]initWithFrame:aFrame]autorelease];

}

CanvasViewController现在使用原来的CanvasView为了在 运行时加一改变,则在CanvasViewController中添加一个方法,通过CanvasViewGenerator取得CanvasView的实例。

- (void)viewDidLoad

{

  [super viewDidLoad];

  CanvasViewGenerator *defaultGenerator =[[[CanvasViewGenerator alloc]init]autorelease];

  [self loadCanvasViewWithGenerator:defaultGenerator];

}

- (void)loadCanvasViewWithGenerator:(CanvasViewGenerator *)generator

{

  [CanvasView_ removeFromSuperView];

  CGRect aFrame = CGReckMake(0,0,320,436);

  CanvasView *aCanvasView = [generator canvasViewWithFrame:aFrame];

  [self setCanvasView:aCanvasView];

  [[self view] addSubview:canvasView_];

}

以上,当选择特定的画布类型时,应用程序会把具体生成器的实例传给loadCanvasViewWithGenerator方法,原来的画布将被新画布替换。

OC编程之道-创建对象之工厂方法的更多相关文章

  1. OC编程之道-创建对象之抽象工厂方法

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.       <AbstractProductA> <AbstractProductB> <Ab ...

  2. OC编程之道-创建对象之单例模式

    一 何为单例singleton模式?(what) 保证一个类只有一个实例,并提供一个访问它的全局访问点. 二 何时使用单例模式?(where) 1类只能有一个实例,而且必须从一个为人熟知的访问点对其访 ...

  3. OC编程之道-创建对象之原型模式

    一 什么是原型模式?(what) 有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高).典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合 ...

  4. OC编程之道-创建对象之生成器模式

    生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...

  5. 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

      工厂方法模式:   定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类.   应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...

  6. OC编程之道-接口适配之适配器

    已有的类与新的接口之间不兼容的问题相当普遍,人们已为它找到了一个解决方案.这个解决方案就是适配器. 1 何为适配器 what 适配器的主要作用是把被适配者的行为传递给管道另一端的客户端. 将一个类的接 ...

  7. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  8. ej3-1优先使用静态工厂方法而非构造函数来创建对象

    背景 很早之前就已经自己翻译了,先简单的贴出来,并做一下回顾. 条款1 优先使用静态工厂方法而非构造函数来创建对象 允许客户端创建一个实例的传统方法是:提供一个公共构造函数:有另外一个必须成为每个程序 ...

  9. oc 工厂方法

    通过上例看oc创建实例有点麻烦,oc里面可以创建工厂方法可以让这个操作更简单一些(其实就是c#或者java里面的静态方法). 新建一个“Cocoa Touch Class”文件,命名为People P ...

随机推荐

  1. JAVA格物致知基础篇:你所不知道的返回码

    上篇我们主要讲解利用Jersey组件如何来写一个能保证基本运行的Rest Service, 之所以说能够基本运行是因为接口暴露及其简易,一旦遇到其他的情况了,就无法正确的处理我们的请求.同时,这个接口 ...

  2. css设置select高度(IE,FF,Chrome)[转]

    大家都知道select是无法设置高度和边框颜色等等的在ie67下面,其他的都是可以的,所以有时候为了在所有的浏览器下显示都一致,就使用了 js的模拟,这个是大家经常碰到的,js不光要模拟外观还有模拟事 ...

  3. Word2Vec 使用总结

    word2vec 是google 推出的做词嵌入(word embedding)的开源工具. 简单的说,它在给定的语料库上训练一个模型,然后会输出所有出现在语料库上的单词的向量表示,这个向量称为&qu ...

  4. 聊聊 Web 项目二维码生成的最佳姿势

    在设计和实现的过程之后,你永远不知道部署上去的程序会已什么样的姿势运行. 本篇借一次生成二维码逻辑的不同实现,阐述 Web 项目中二维码生成的正确姿势. 文中如有批量,欢迎各位看客老爷拍砖.试运行前5 ...

  5. Chrome开发者工具详解

    http://www.cnblogs.com/LibraThinker/p/5948448.html http://www.cnblogs.com/LibraThinker/p/5981346.htm ...

  6. 让JavaScript回归函数式编程的本质

    JavaScript是一门被误会最深的语言,这话一点不假,我们看下它的发展历史. 1995年,Netscape要推向市场,需要一门脚本语言来配套它.是使用一门已有的语言,还是发明一门新的语言,这也不是 ...

  7. MySQL主从复制中常见的3个错误及填坑方案

    一.问题描述 主从复制错误一直是MySQL DBA一直填不完的坑,如鲠在喉,也有人说mysql主从复制不稳定云云,其实MySQL复制比我们想象中要坚强得多,而绝大部分DBA却认为只要跳过错误继续复制就 ...

  8. python day1:初识Python(一)

    一.Python 简介: Python免费.开源,面向对象的解释型语言,其语法简洁,在使用中无需考虑如何管理内存等底层问题,并且支持在linux,windows等多平台运行,Python的标准库很强大 ...

  9. 微信JS接口

      微信JS接口 分享到朋友圈 分享给朋友 分享到QQ 拍照或从手机相册中选图 识别音频并返回识别结果 使用微信内置地图查看位置来源:http://www.cnblogs.com/txw1958/p/ ...

  10. a版本冲刺第五天

    队名:Aruba   队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章  鼎 运动会这几天两位同学准备比赛也确实比较忙,两位同学又刚好有事回家去了,由于之前git解决一次冲突后,远程我们还不能很好地 ...