iOS中的设计模式——原型(Prototype)
原型模式(Prototype):是指使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。说人话:OC中可以通过深复制来快速而方便的创建一个新对象。
使用场景
1.需要创建的对象应独立于其类型与创建方式。也就是说我们想要的对象并不能够直接通过初始化函数来创建出来,其创建过程不具有普遍性且复杂。
2.要实例化类是在运行时决定的。在编写代码的时候并不知道哪种对象会被创建出来,其内部的结构如何复杂(例如:复杂程度取决于用户的操作)
3.不想要与产品层次相对应的工厂层次。不通过工厂方法或者抽象工厂来控制产品的创建过程,想要直接复制对象。
4.不同类的实例间的差异仅是状态的若干组合。因此复制相应数量的原型比手工实例化更加方便。
5.类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对象并对副本进行修改会更加容易。内部结构复杂,不容易重现。
以下两种常见的使用场景:
1.有很多相关的类,其行为略有不同,而且主要差异在于内部属性,如名称、图像等;
2.需要使用组合(树形)对象作为其他东西的基础,例如,使用组合对象作为组件来构建另一个组合对象。
也就是说,通过初始化方法创建对象时特别繁琐(甚至无法实现),可以考虑使用原型模式深拷贝出一份模型副本。
<pre>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@end
@implementation Person
- (id)copyWithZone:(NSZone *)zone {
Person *p = [[[self class] allocWithZone:zone] init];
p.name = self.name;//需要设置属性
p.age = self.age;
return p;
}
@end
Person *p1 = [[Person alloc] init];
p1.name = @"name1";
p1.age = 29;
Person *p2 = [p1 copy];
NSLog(@"%@:%@, %d", p1, p1.name, p1.age);
NSLog(@"%@:%@, %d", p2, p2.name, p2.age);
</pre>