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

一 什么是原型模式?(what)

有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高)。典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合体非常困难。可以通过轻微的改动重用已有的对象,以适应程序中的特定情况。

原型模式属于创建性设计模式,通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种1)浅拷贝2)深拷贝。

二 何时使用原型模式?(where)

1要实例化的类要在运行时才确定。

2很多相关的类,其行为略有不同,而且主要差异在于内部属性,如名称、图像等。

3需要使用组合(树型)对象作为其他东西的基础,例如,使用组合对象作为组件来构建另一个组合对象。

4需创建的对象应独立于其类型与创建方式。?

5不想要与产品层次相对应的工厂层次。?

注意:不管什么对象,只要复制自身比手工实例化要好,都可以是原型对象。

三 cocoa touch框架中的对象复制

NSObject有一个实例方法叫做(id)copy,默认的copy方法调用[self copyWithZone:nil]。

NSObject协议没有声明copy方法。

NSCopying协议,声明了copyWithZone方法。

当NSObject型的接收器收到copy消息时,NSObject会一次向其采用了NSCopying协议的子类发送消息。

四 具体实现原型模式?(how)

Mark<NSObject>协议

属性:color,size,location,count,id<mark>lastChild

方法:-(id)copy,addMark:mark,removeMark:mark,childMarkAtIndex:index;

Vertex对象用于组成线条,并不包含颜色、大小等其他信息。

Vertex:NSObject <Mark,NSCopying>

属性:同上,location_

方法:同上(除了copy方法),initWithLocation:location,copyWithZone:zone;

避免编译警告。解释在编程之道的p42页。

- (id)copyWithZone:(NSZone *)zone

{

  Vertex *vertexCopy =[[[self class]allocWithZone:zone]initWithLocation:location_];

  return vertexCopy;

}

 Dot包含颜色与大小,以表示这个点

Dot:Vertex

属性:color,size

方法:copyWithZone:(NSZone *)zone;

Stroke:NSObject <Mark,NSCopying>

五 使用

假定用户选择了一个叫做selectedMark的Mark实例作为图样模板。

id <Mark> patternTemplate = [selecteMark copy];

[templateArray addObject:patternTemplate];

当用户要把先前保存的一个图样模板应用到CanvasView的时候

id <Mark> patternClone = [templateArray objectAtIndex:patternIndex];

[currentMark addMark:patternClone];

[canvasView setMark:currentMark];

[canvasView setNeedsDisplay];

原文地址:https://www.cnblogs.com/encoreMiao/p/5198071.html