设计模式——原型模式

什么是原型模式?

原型模式属于创建性设计模式,它通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种:1.)浅拷贝(指针拷贝); 2.)深拷贝(值拷贝);采用原型模式创建一个新的对象效率更高。

什么是深拷贝和浅拷贝?

深拷贝也叫做值拷贝,新创建的对象会在内存中开辟新的空间,而把被拷贝对象的值拷贝过来;浅拷贝也叫做指针拷贝,新创建的对象的指针与原对象的指针指向相同的内存空间,并有相同的值,浅拷贝的对象就如同原对象的影子

NSString*str = @”AAA”;

NSString*strCopy = [str copy];

NSMutableString*strMCopy = [str mutableCopy];

NSLog(@”str对象:%@, 地址:%p”, str, str);

NSLog(@”strCopy对象:%@,地址: %p”, strCopy,strCopy);

NSLog(@”strMcopy对象:%@, 地址:%p”, strMcopy, strMCopy);

2014-10-07 09:28:18.578 Prototype_Demo[516:303] str对象:AAA, 地址:0x100001058

2014-10-07 09:28:18.579 Prototype_Demo[516:303] strCopy对象:AAA, 地址:0x100001058

2014-10-07 09:28:18.580 Prototype_Demo[516:303] strMCopy对象:AAA, 地址:0x10010af70

什么场景下使用原型模式?

  1. 对象类型需要在运行时才能确定

  2. 需要某对象在某状态下的副本

  3. 对象间的差别很小,使用原型系统复制一个对象后再进行必要的修改

如何实现原型模式?

1.) 定义一个Person类,其中包含三个属性变量:

@interface Person : NSObject <NSCopying, NSMutableCopying>

@property (nonatomic, copy)NSMutableString *name;

@property (nonatomic, copy) NSString*sex;

@property (nonatomic, assign) int age;

- (id)initWithName:(NSMutableString *)aName withSex:(NSString *) aSex withAge:(int) aAge;

2.)在实现文件中实现初始化和协议中必须实现的方法

- (id)initWithName:(NSMutableString *)aName withSex:(NSString *) aSex withAge:(int) aAge{

if (self = [super init]) {

self.name = aName;

self.sex = aSex;

self.age = aAge;

}

return self;

}

//这里需要注意,当对象调用copy方法时,将得到不可变对象,不管该对象之前是可变还是不可变的。而调用mutableCopy则会得到可变对象,不管该对象之前是可变还是不可变。

- (id)copyWithZone:(NSZone *)zone

{

Person *obj = [[self class] allocWithZone:zone];

obj.name = [self.name mutableCopy];

obj.sex = [self.sex copy];

obj.age = self.age;

return obj;

}

- (id)mutableCopyWithZone:(NSZone*)zone{

Person *obj = [[self class] allocWithZone:zone];

obj.name = [self.name mutableCopy];

obj.sex = [self.sex copy];

obj.age = self.age;

return obj;

}

3.) 在main函数中使用copy和mutableCopy方法创建新的对象

NSMutableString *name = [NSMutableString stringWithFormat:@"AAA"];

Person *person = [[Person alloc] initWithName:name withSex:@"Boy" withAge:20];

Person *aPerson = [person copy];

NSLog(@"%@", aPerson.name);

Person *bPerson = [person mutableCopy];

NSLog(@"%@", bPerson.sex);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值