设计模式——原型模式
2016-01-26 10:38
369 查看
什么是原型模式?
原型模式属于创建性设计模式,它通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种: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.) 定义一个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);
相关文章推荐
- ConcurrentLinkedQueue使用方法
- Boost 学习之算法篇 one_of 与 one_of_equal
- EST科技英语写作
- 欢迎使用CSDN-markdown编辑器
- 解析验证电话号码的库
- Codeforces617 E . XOR and Favorite Number(莫队算法)
- iOS输入法开发(Swift)
- Codeforces617 E . XOR and Favorite Number(莫队算法)
- hdu 1238 Substrings KMP问题
- 根据传入的ip地址,从arp表中查找mac地址并返回
- 初谈组件封装
- NodeJs的流
- Linux 内核的同步机制(1)
- mongodb的NUMA问题
- 九个Console命令,让js调试更简单
- 莫队算法
- Linux 驱动开发概述
- JS魔法堂:函数重载 之 获取变量的数据类型
- android tablayout结合viewpager实现带导航条的滑动页卡
- Oracle表连接操作——Hash Join(哈希连接)