官方定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象
通俗的讲就是根据一个原型创建一个新的对象(创建的方式实质就是拷贝原型自己),而且不需要知道新对象创建的细节
1、某些对象组合起来特别复杂,而重新创建费时又费力,此时通过拷贝能达到其目的
通过代码说明问题
1、定义一个协议
#import
@protocol PrototypeProtocol <NSObject>
-(instancetype)clone;
@end
2、创建数据模型(这是一个简单的例子,通过这个例子说明问题)
#import
#import "PrototypeProtocol.h"
@interface StudentModel : NSObject<PrototypeProtocol>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age ;
@property (nonatomic, strong) NSString *hobby;
-(instancetype)clone;
@end
-------
#import "StudentModel.h"
@implementation StudentModel
//实现协议
-(instancetype)clone{
StudentModel *stu = [[[self class] alloc] init];
//属性复制
stu.name = self.name;
stu.age = self.age;
stu.hobby = self.hobby;
return stu;
}
- (NSString *)description
{
return [NSString stringWithFormat:@" {\nname=%@,age=%ld,hobby=%@\n}\n" , self, self.name, self.age.integerValue, self.hobby];
}
3、调用实现
StudentModel *stu1 = [[StudentModel alloc]init];
stu1.name = @"小白";
stu1.age = @12;
stu1.hobby = @"跑步";
//使用常规设计模式
StudentModel *stu2 = [[StudentModel alloc]init];
stu2.name = @"小红";
stu2.age = @12;
stu2.hobby = @"跑步";
//使用原型设计模式
StudentModel *stu3 = [stu1 clone];
stu3.name = @"小明";
NSLog(@"\n%@%@%@",stu1.description,stu2.description,stu3.description);
可以观察到stu1和stu2只是名字不同,其他属性都相同,假定stu1和stu2有很多相同的属性值,依次赋值是一件费时费力的事,这种情况下,我们就可以用原型设计模式,如stu3的实现
原型模式可以被理解是一种深复制的行为
不是复制指针值,而是复制指针所指向的资源,简单说就是开辟了真正的内存复制
只是将指针复制给新对象,那么底层的资源实际上仍然由两个实例在共享。其实两者指向的都是同一块内存。简单说就是只复制指针,堆内存不变
在Cocoa Touch中为NSObject的派生类提供了实现深复制的协议,NSObject的子类需要实现NSCopying协议及其方法- (id)copyWithZone:(nullable NSZone *)zone,NSObject有一个实例方法-(id)copy,默认copy会调用[self copyWithZone:nil],对于采纳了NSCopying协议的子类,需要实现这个方法,否则会引发异常。