一,原型模式
"使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象",简单说就是根据原型来创建对象,而不需要知道具体的创建细节。
模式结构:
在原型模式的结构中:
Prototype是一个接口,用来统一规范了一个clone()方法,用来执行对象的拷贝
ConcretePrototype1和ConcretePrototype2是实现Prototype接口方法的两个具体类。
Client是用户方代码,在用户方如果想实现ConcretePrototype1/ConcretePrototype2对象的创建,可以借助一个现成的对象,调用clone()方法即可。
很多设计模式的书籍会采用不同的面向对象的语言进行阐述。不同的面相对象语言的语法各自不同,代码书写必然差异很大。所以设计模式更多是一种代码结构的指导思想,理解了模式的结构以后,应该结合自己掌握的编程语言,灵活运用。
二,iOS中的原型设计模式
如果想要提供一个对象复制的统一定义,OC语法中使用协议(protocol)。
在OC中已经有了一个用于对象拷贝的协议NSCopying,里面规范了一个方法
- (id)copyWithZone:(nullable NSZone *)zone;
那么自己创建一个类,遵守NSCopying协议,实现copyWithZone:方法,就完成了原型模式的大致结构。
不同于图中的描述,在iOS中,我们通过调用一个实现了NSCopying协议的类的对象的copy方法,即可得到一份对象的拷贝。copy方法会内部调用copyWithZone方法。
三,代码举例
@interface ZGYBook : NSObject
<NSCopying>
@property (nonatomic, copy) NSString * name;
@property (nonatomic, strong) NSString * author;
@property (nonatomic, strong) NSString * writeDate;
@end
@implementation ZGYBook
- (id)copyWithZone:(NSZone *)zone{
return [[[self class] allocWithZone:zone]init];//这里一定要使用 [self class],想知道原因可以问我。
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
ZGYBook * book1 = [[ZGYBook alloc]init];
book1.name = @"三国演义";
book1.author = @"罗贯中";
book1.writeDate = @"元末明初洪武年间";
ZGYBook * book2 = [book1 copy];
NSLog(@"%p %p",book1,book2);
book2.name = @"西游记";
NSLog(@"%@ %@",book1.name, book2.name);
}
2017-09-26 21:39:02.913884+0800 设计模式(原型设计模式)[50128:15851450] 0x600000037080 0x604000036960
2017-09-26 21:39:02.914094+0800 设计模式(原型设计模式)[50128:15851450] 三国演义 西游记
四,深拷贝和浅拷贝
只是对象指针的简单赋值,没有对对象内存空间进行新的开辟和空间内容复制,是浅拷贝。这样拷贝以后新的引用和被拷贝的引用指向同一块内存空间。
拷贝过程中,如果重新申请了内存空间,并且把被拷贝对象内容进行了复制,成为深拷贝。这样新旧引用分别指向不同的内存地址。
这样可以看出上述ZGYBook类遵守NSCopying协议,实现copyWithZone方法以后,实现的是深拷贝。
关于深拷贝和浅拷贝,还有更深层次的解释,想要了解的小伙伴,可以私下call我。
五,NSCopying和NSMutableCopying
参考帖子:http://www.jianshu.com/p/e98e6e30ebda