原理
原型模式一般用于实例对象功能相同,且需要重复生成多个相同类型仅仅只有数据有区别的实例对象。例如我们需要打印一个年级其中一个班级的学生的简历或档案的信息,这个时候我们需要生成多个相同的实例,这种情况我们回归到代码中一般就是用原型模式来处理。在项目中有时候我们可能也需要对某个实例对象进行多次临时拷贝操作,也可以考虑使用原型模式,操作起来更加地方便。
角色
原型模式包含以下角色:
- 抽象原型角色:抽象角色,通常用于定义可以被克隆(copy)抽象对象的接口;
- 具体原型角色:被复制的对象,此角色用于实现抽象对象接口功能;
代码
/** 学生简历上的学校相关信息 */
//JZSchoolInfo.h (抽象类)
@interface JZSchoolInfo : NSObject
@property (nonatomic, copy) NSString *schoolName;
@property (nonatomic, copy) NSString *schoolProfession;
@property (nonatomic, copy) NSString *schoolFixYear;
@end
//JZSchoolInfo.m 需实现NSCopying协议接口 (具体类)
@interface JZSchoolInfo()<NSCopying>
@end
@implementation JZSchoolInfo
- (id)copyWithZone:(NSZone *)zone {
JZSchoolInfo *schoolInfo = [[[self class] allocWithZone:zone] init];
schoolInfo.schoolName = [self.schoolName mutableCopy];
schoolInfo.schoolProfession = [self.schoolProfession mutableCopy];
schoolInfo.schoolFixYear = [self.schoolFixYear mutableCopy];
return schoolInfo;
}
@end
/** 学生简历信息 */
//JZResume.h(抽象类)
#import "JZSchoolInfo.h"
@interface JZResume : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *mobile;
@property (nonatomic, copy) NSString *address;
@property (nonatomic, strong) JZSchoolInfo *schoolInfo;
- (void)printInfo;
@end
//JZResume.m 需实现NSCopying协议接口(具体类)
@interface JZResume()<NSCopying>
@end
@implementation JZResume
- (void)printInfo {
NSLog(@"姓名:%@", self.name);
NSLog(@"手机号码:%@", self.mobile);
NSLog(@"地址:%@", self.address);
NSLog(@"---个人简历信息--");
NSLog(@"学习名称:%@", self.schoolInfo.schoolName);
NSLog(@"教育年限:%@", self.schoolInfo.schoolFixYear);
NSLog(@"专业名称:%@", self.schoolInfo.schoolProfession);
}
- (id)copyWithZone:(NSZone *)zone {
JZResume *resume = [[JZResume allocWithZone:zone] init];
resume.name = [self.name mutableCopy];
resume.mobile = [self.mobile mutableCopy];
resume.address = [self.address mutableCopy];
resume.schoolInfo = [self.schoolInfo copy];
return resume;
}
@end
//具体实现代码
- (void)main {
JZSchoolInfo *schoolInfo = [JZSchoolInfo new];
schoolInfo.schoolName = @"汫洲小学";
schoolInfo.schoolProfession = @"美术";
schoolInfo.schoolFixYear = @"九年义务教育";
JZResume *resume = [JZResume new];
resume.name = @"张三";
resume.mobile = @"10086";
resume.address = @"天朝帝都";
resume.schoolInfo = schoolInfo;
[resume printInfo];
JZResume *weiResume = [resume copy];
weiResume.name = @"西门哥"; //更改学生信息
[weiResume printInfo];
}
优点
- 简化了生成多个相同实例不同数据的过程,使得开发效率提高;
- 实现这个相同类型的实例的对象,可以快速通过克隆来进行实现;
缺点
- 如果是实例中存在着差异性较大时,就不能使用原型模式来实现;