原型模式
原型模式:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。
客户端知道抽象Prototype类,在运行时,抽象Prototype子类的任何对象都可以按客户端的意愿被复制。
原型模式的使用场景
- 需要创建的对象应独立于其类型与创建方式。
- 要实例化的类是在运行时决定的。
- 不同类的实例间的差异仅是状态的若干组合,因此复制相应数量的原型比手工实例化更加方便。
原型模式在CocoaTouch中的应用
NSObject的子类需要实现NSCopying协议及方法- (id)copyWithZone:(NSZone *)zone。NSObject有一个实例方法叫(id)copy。默认的copy方法调用[self copyWithZone:nil]。对于遵守NSCopying协议的子类,需要实现这个方法,否则会引发异常。
原型模式在Objective-C中的实现
- 创建原型协议并遵守NSObject协议
在原型协议中声明- (id)copy接口
1、当使用具体子类调用copy方法是没有问题的,因为在NSObject类中声明了这个方法,所以所有的具体子类都可以直接调用。
2、但是在使用遵守原型协议的id类型发送copy消息时,由于在NSObject协议中并没有这个接口这里编译器会报错,所以这里需要我们手动声明这个接口,主要目的是解决编译器报错的问题。各个子类类遵守原型协议和NSCopy协议并重写- (id)copyWithZone:(NSZone *)zone方法
任何一个继承NSObject的子类,在收到copy消息时就会自动调用该类的copyWithZone方法,所以原型协议中的copy接口我们是不需要实现的。
这样就原型模式就实现了,在运行时,任何遵守原型协议对象都可以直接通过copy方法进行复制,并且可以使用遵守原型协议的id类型获取。
例如:
id<Animal> animal1 = [[任意遵守原型协议对象 alloc] init];
id<Animal> animal2 = [animale1 copy];