WHAT原型模式:
原型模式在Objective-C
中,最直观的表现就是NSObject
的- (id)copy;
方法。当我们调用- (id)copy;
方法其实最终调用的是-(id)copyWithZone:(NSZone *)zone;
。我们可以通过实现<NSCopying>
协议中的-(id)copyWithZone:(NSZone *)zone;
方法返回复制的新对象。我们根据一个给定的原型
可以复制出多个相同类型的实例。在此给原型模型下个定义:给定一个原型类,我们就可以通过复制类或其子类的实例的方式得到多个相同类型的实例。
图中的Prototype
可以对应Objective-C
中NSObject
类,ConcretePrototype1
和ConcretePrototype2
可能是继承自NSObject
的子类。子类各自实现了<NSCopying>
的-(id)copyWithZone:(NSZone *)zone;
的方法。
WHEN原型模式:
- 需要创建的对象独立于其类型与创建方式。
- 要实例化的类是在运行时决定的。
- 不想要与产品层次相对应的工厂层次。
- 类的实例间的差异仅是状态的若干组合。因此复制相应数量的原型比手工实例化更加方便。
- 类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对像并对副本进行修改会更加容易。
以上是书上的原话,翻译的实在是有点难懂。
我觉得何时使用原型模式主要在:
- 希望快速获取实例对象。而不用管类的结构和创建方式。
- 类生成的实例之间区别不大,可能仅仅只是某个属性的状态不同。可以考虑使用原生模型生成副本,然后对副本的属性进行修改。
- 实例对象生成繁琐的时候。可能你创建一个实例需要配置很多的属性变量,如组合对象。而复制一个副本,对其进行简单修改就获得到我们需要的对象。
还有其它几条还没领悟,有想法的同学可以留言
浅复制 & 深复制
简言之:浅复制就是指针拷贝;深复制就是内容拷贝。不知道的同学请自行百度、Google,需加强基本功。
Shadow Copy:指向同一个对象 Deep Copy:指向不同的对象
网友评论