1. 原型模式概述
原型模式: 使用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建爱你新的对象. 原型模式是一种对象创建型模式.
学习这个设计模式参考的是刘伟的博客, 讲的大概意思, 说白了就类似于C++中对象的拷贝, 包括深拷贝和浅拷贝, 其中的原理特性什么的也都是完全相同的. 这个设计模式是比较简单的, 一看就懂, 个人觉得没什么好说的.
原型模式中包含的几个角色:
- Prototype(抽象原型类): 它是声明克隆方法的接口, 它是所有具体原型类的父类, 可以是抽象类也可以是接口, 甚至可以是具体实现类.
- ConcreatePrototype(具体原型类): 它实现了抽象原型类中声明的克隆方法, 在克隆方法中返回自己的一个克隆对象.
- Client(客户端): 让一个圆形对象克隆自身从而创建一个新的对象, 在客户类中只需要直接实例化或者通过工厂方法等方式创建一个原型对象, 再通过调用该对象的克隆方法即可得到多个相同的对象. 由于客户类针对抽象原型类Prototype编程, 因此用户可以根据需要选择具体原型类. 系统具有较好的扩展性, 增加或者更换原型类都比较方便.
2. Swift实现一个例子
好吧, 这个太简单了, 太容易理解了, 就不谢例子了, 描述一下吧! 比如自定义了一个对象, 对象有几个属性, 浅拷贝就是只拷贝地址, 地址中内容是不变的, 通过一个地址修改地址中的内容, 则拷贝的地址中内容也会跟着变化; 深拷贝就是拷贝地址中的内容, 这时候需要重新开辟内存空间存放值.
3. 原型模式总结
原型模式作为一种快速创建大量相同或者相似对象的方式, 在软件开发中应用还是比较广泛的.
3.1 原型模式的主要优点
- 当创建新的对象实例比较复杂时候, 使用原型模式可以简化对象创建过程. 通过复制一个已有实例来提高新实例的创建效率.
- 扩展性好, 由于在原型模式中提供了抽象原型类, 在客户端可以针对抽象原型类编程, 而降具体原型类写在配置文件中, 增加或者减少产品类对系统都没有任何影响.
- 原型模式提供了简化的创建结构, 工厂方法模式通常需要一个与产品类等级结构相同的工厂等级结构, 而原型模式就不需要这样, 原型模式中产品的复制是通过封装在原型类中的克隆方法实现的, 无需专门的工厂类来创建产品.
- 可以使用深克隆保存对象的状态, 使用原型模式将对象复制一份并将其保存起来, 以便在需要时候使用, 可辅助实现撤销操作.
3.2 主要缺点
- 需要为每一个类配备一个克隆方法, 而且该克隆方法位于类的内部, 当对已有的类进行修改时候, 需要修改源代码, 违背了"开闭原则".
- 在实现深克隆时需要编写复杂的代码, 而且当对象之间存在多重的嵌套引用时候, 为了实现深克隆, 每一层对象对应的类都必须支持深克隆, 实现起来会比较麻烦.
3.3 适用场景
- 创建新对象成本较大(如初始化需要较长的时间, 占用太多的CPU或者网络资源), 新的对象可以通过原型模式复制已有对象来获得, 如果是相似对象, 则可以对其成员变量稍作修改.
- 如果系统要保存对象状态, 而对象状态变化很小或者对象本身占用内存较少时候, 可以通过原型模式配合备忘录模式来实现.
- 需要避免分层次的工厂类来创建分层次的对象, 并且类的实例对象只有一个或者很少几个组合状态, 通过复制原型对象得到新实例可能比通过构造函数创建新实例更加方便.
Reference: