设计模式-(1)原型模式

一,原型模式

"使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象",简单说就是根据原型来创建对象,而不需要知道具体的创建细节。

模式结构:

原型模式的结构中:

Prototype是一个接口,用来统一规范了一个clone()方法,用来执行对象的拷贝

ConcretePrototype1和ConcretePrototype2是实现Prototype接口方法的两个具体类。

Client是用户方代码,在用户方如果想实现ConcretePrototype1/ConcretePrototype2对象的创建,可以借助一个现成的对象,调用clone()方法即可。

很多设计模式的书籍会采用不同的面向对象的语言进行阐述。不同的面相对象语言的语法各自不同,代码书写必然差异很大。所以设计模式更多是一种代码结构的指导思想,理解了模式的结构以后,应该结合自己掌握的编程语言,灵活运用。


二,iOS中的原型设计模式

如果想要提供一个对象复制的统一定义,OC语法中使用协议(protocol)。

在OC中已经有了一个用于对象拷贝的协议NSCopying,里面规范了一个方法

- (id)copyWithZone:(nullable NSZone *)zone;

那么自己创建一个类,遵守NSCopying协议,实现copyWithZone:方法,就完成了原型模式的大致结构。

不同于图中的描述,在iOS中,我们通过调用一个实现了NSCopying协议的类的对象的copy方法,即可得到一份对象的拷贝。copy方法会内部调用copyWithZone方法。


三,代码举例

@interface ZGYBook : NSObject
<NSCopying>

@property (nonatomic, copy) NSString * name;
@property (nonatomic, strong) NSString * author;
@property (nonatomic, strong) NSString * writeDate;

@end

@implementation ZGYBook

- (id)copyWithZone:(NSZone *)zone{
    return [[[self class] allocWithZone:zone]init];//这里一定要使用 [self class],想知道原因可以问我。
}

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    ZGYBook * book1 = [[ZGYBook alloc]init];
    book1.name = @"三国演义";
    book1.author = @"罗贯中";
    book1.writeDate = @"元末明初洪武年间";
    ZGYBook * book2 = [book1 copy];
    NSLog(@"%p %p",book1,book2);
    book2.name = @"西游记";
    NSLog(@"%@ %@",book1.name, book2.name);
}

2017-09-26 21:39:02.913884+0800 设计模式(原型设计模式)[50128:15851450] 0x600000037080 0x604000036960
2017-09-26 21:39:02.914094+0800 设计模式(原型设计模式)[50128:15851450] 三国演义 西游记

四,深拷贝和浅拷贝

只是对象指针的简单赋值,没有对对象内存空间进行新的开辟和空间内容复制,是浅拷贝。这样拷贝以后新的引用和被拷贝的引用指向同一块内存空间。

拷贝过程中,如果重新申请了内存空间,并且把被拷贝对象内容进行了复制,成为深拷贝。这样新旧引用分别指向不同的内存地址。

这样可以看出上述ZGYBook类遵守NSCopying协议,实现copyWithZone方法以后,实现的是深拷贝。

关于深拷贝和浅拷贝,还有更深层次的解释,想要了解的小伙伴,可以私下call我。


五,NSCopying和NSMutableCopying

参考帖子:http://www.jianshu.com/p/e98e6e30ebda

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值