原型模式

原理

原型模式一般用于实例对象功能相同,且需要重复生成多个相同类型仅仅只有数据有区别的实例对象。例如我们需要打印一个年级其中一个班级的学生的简历或档案的信息,这个时候我们需要生成多个相同的实例,这种情况我们回归到代码中一般就是用原型模式来处理。在项目中有时候我们可能也需要对某个实例对象进行多次临时拷贝操作,也可以考虑使用原型模式,操作起来更加地方便。

角色

原型模式包含以下角色:

  1. 抽象原型角色:抽象角色,通常用于定义可以被克隆(copy)抽象对象的接口;
  2. 具体原型角色:被复制的对象,此角色用于实现抽象对象接口功能;

代码

/** 学生简历上的学校相关信息 */
//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];
}

优点

  1. 简化了生成多个相同实例不同数据的过程,使得开发效率提高;
  2. 实现这个相同类型的实例的对象,可以快速通过克隆来进行实现;

缺点

  1. 如果是实例中存在着差异性较大时,就不能使用原型模式来实现;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值