OC编程之道-创建对象之工厂方法
一 何为工厂方法模式?(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编程之道-创建对象之工厂方法的更多相关文章
- OC编程之道-创建对象之抽象工厂方法
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. <AbstractProductA> <AbstractProductB> <Ab ...
- OC编程之道-创建对象之单例模式
一 何为单例singleton模式?(what) 保证一个类只有一个实例,并提供一个访问它的全局访问点. 二 何时使用单例模式?(where) 1类只能有一个实例,而且必须从一个为人熟知的访问点对其访 ...
- OC编程之道-创建对象之原型模式
一 什么是原型模式?(what) 有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高).典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合 ...
- OC编程之道-创建对象之生成器模式
生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...
- 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类. 应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...
- OC编程之道-接口适配之适配器
已有的类与新的接口之间不兼容的问题相当普遍,人们已为它找到了一个解决方案.这个解决方案就是适配器. 1 何为适配器 what 适配器的主要作用是把被适配者的行为传递给管道另一端的客户端. 将一个类的接 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- ej3-1优先使用静态工厂方法而非构造函数来创建对象
背景 很早之前就已经自己翻译了,先简单的贴出来,并做一下回顾. 条款1 优先使用静态工厂方法而非构造函数来创建对象 允许客户端创建一个实例的传统方法是:提供一个公共构造函数:有另外一个必须成为每个程序 ...
- oc 工厂方法
通过上例看oc创建实例有点麻烦,oc里面可以创建工厂方法可以让这个操作更简单一些(其实就是c#或者java里面的静态方法). 新建一个“Cocoa Touch Class”文件,命名为People P ...
随机推荐
- 学python
1.*和** def sum(*x): ans=0 for i in x: ans+=i return ans def haha(one,two): print(one,' ',two) print( ...
- 通过form上传文件(php)
前段代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; ...
- Java,来源于大神
也许你学习了那么久的Java了,但如果有人问你什么是JavaEE?你会怎么回答他呢?在此我来谈谈关于JavaEE的相关技术.(仅是个人见解) 在谈JavaEE时,我们首先来了解一下Java平台.目前, ...
- gulp实现打包js/css/img/html文件,并对js/css/img文件加上版本号
参考打包教程: http://www.cnblogs.com/tugenhua0707/p/4069769.html http://www.cnblogs.com/tugenhua0707/p/498 ...
- hadoop在网页客户端的maven配置
hadoop网页客户端maven配置,只能在tomcat7上运行,tomcat6和tomcat8运行会出错,我用的是tomcat-7.0.67 完整的pom.xml内容为: <!-- 这个配置只 ...
- 使用 zssh 进行 Zmodem 文件传输
Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...
- codevs 2021 中庸之道
2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次 ...
- C# 调用C++ SDK/API的问题总结
1.回调函数的使用 c++的回调函数如下所示: typedef void (CALLBACK *Data)(long lHandle, DATA_TYPE eDataType, unsigned ch ...
- Fast Member
https://github.com/mgravell/fast-member/ http://stackoverflow.com/questions/6158768/c-sharp-reflecti ...
- VirtualBox Guest Additions 在CentOS中无法安装的解决方法
安装时出现一步错误查看log为(log文件是 /var/log/vboxadd-install.log): /tmp/vbox.0/Makefile.include.header:94: *** Er ...