原型模式(Prototype Pattern): 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
适用场景
- 对象层级嵌套比较多,从零到一创建对象的过程比较繁琐时,可以直接通过复制的方式创建新的对象
- 当一个类的实例只能有几个不同状态组合中的一种时,我们可以利用已有的对象进行复制来获得
场景概述
模拟一份校招的简历,简历里面有人名,性别,年龄以及学历相关的信息。这里面学历相关的信息又包含学校名称,专业,开始和截止年限的信息。
简历对象:
- 人名
- 性别
- 年龄
- 学历对象
- 学校名称
- 专业
- 开始年份
- 结束年份
而且因为对于同一学校同一届的同一专业的毕业生来说,学历对象中的信息是相同的,这时候如果需要大量生成这些毕业生的简历的话比较适合使用原型模式。
因为要实现copy
,我们来定义一个协议ProtoypeCopyProtocol
,里面有一个必须实现的方法
- (id)clone;
学历对象UniversityInfo
因为我们会对UniversityInfo
对象进行copy,所以我们需要实现我们的ProtoypeCopyProtocol
协议
@interface UniversityInfo : NSObject<ProtoypeCopyProtocol>
@property (nonatomic,copy) NSString *university; //大学
@property (nonatomic,copy) NSString *major; //专业
@property (nonatomic,copy) NSString *startYear; //开始年份
@property (nonatomic,copy) NSString *endYear; //结束年份
@end
实现协议
- (id)clone{
UniversityInfo * university = [[[self class] alloc]init];
//完成复制信息
university.university = self.university;
university.major = self.major;
university.startYear = self.startYear;
university.endYear = self.endYear;
return university;
}
简历对象Resume
@interface Resume : NSObject
//姓名
@property (nonatomic,copy) NSString *name;
//性别
@property (nonatomic,assign) NSInteger sex;
//年龄
@property (nonatomic,assign) NSInteger age;
//学历
@property (nonatomic,strong) UniversityInfo *university;
@end
客户端实现
UniversityInfo *info = [[UniversityInfo alloc] init];
info.university = @"清华大学";
info.major = @"计算机";
info.startYear = @"2010-03-01";
info.endYear = @"2014-10-10";
//小明简历
Resume *resume1 = [[Resume alloc] init];
resume1.name = @"小明";
resume1.sex = 1;
resume1.age = 25;
resume1.university = [info clone];
//小红简历
Resume *resume2 = [[Resume alloc] init];
resume2.name = @"小红";
resume2.sex = 0;
resume2.age = 26;
resume2.university = [info clone];
我们打印三个UniversityInfo
的地址,我们可以发现是创建了三个不同的对象
上面是我们自己定义的一个协议,其实在iOS已经提供了一个协议NSCopying&NSMutableCopying
协议,我们只需要实现NSCopying&NSMutableCopying
协议就可以了