设计模式之原型模式
2018-12-22
定义
通过“复制”一个已经存在的实例来返回新的实例,被复制的实例就是我们所称的“原型”。
角色
Prototype: 原型
定义用于复制现有实例来生成新实例的方法
ConcretePrototype:具体原型
具体负责复制任务的类
Client:使用者
让一个原型对象克隆自身从而创建一个新的对象

示例
java中提供了对象复制的方法,通过实现clonable接口和调用对象的clone方法就可以实现对象复制,下面就以这个为基础简单实现一下原型模式
1 | /** “Prototype“ **/ |
注意:java 对象clone方法进行的是浅复制,所谓的浅拷贝就是拷贝指向对象的引用。假设对象中有一个数组字段,那么拷贝出来的对象和原来的对象的确不是同一个对象(引用不同),但两个对象里面的数组字段都指向同一个引用。要实现真正的深拷贝,可以通过重写
clone方法实现自己的复制方法实现。
优点
提高性能和效率
当创建新的对象实例较为复杂时(需要非常繁琐的数据准备),通过复制一个已有实例可以提高新实例的创建效率。
可以保存对象的状态
使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(如恢复到某一历史状态),可辅助实现撤销操作。
我们日常用到的复制(Ctrl + C)和粘贴(Ctrl + V)操作、开发用到的IDE提供的撤销和恢复历史操作就是原型模式的典型应用
缺点
实现麻烦
要是想实现深复制,当对象存在多层嵌套引用时,每一层对象对应的类都必须支持深复制,实现比较麻烦
适用场景
- 创建复杂的或者耗时的实例
这种情况下,通过复制一个已经存在的实例更高效
参考
https://test-design-patterns.readthedocs.io/zh/latest/creational_patterns/prototype.html