设计模式-06-原型模式
个人github地址:HibisciDai
设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai
processon在线UML类图:processon
[TOC]
设计模式-06-原型模式
原型模式(Prototype Pattern)
意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决
在运行期建立和删除原型。
何时使用
- 当一个系统应该独立于它的产品创建,构成和表示时。
- 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
关键代码
实现克隆操作,在 JAVA 继承 Cloneable,重写 clone()。
如何解决
利用已有的一个原型对象,快速地生成和原型对象一样的实例。
应用实例
- 细胞分裂。
- JAVA 中的 Object clone() 方法。
优点
- 性能提高。
- 逃避构造函数的约束。
缺点
- 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
- 必须实现 Cloneable 接口。
注意事项
与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝
实现 Cloneable,重写;深拷贝
是通过实现 Serializable 读取二进制流。
在运行期间建立和删除原型
- 当一个系统应独立于他的产品创建、构成和表示时。
- 实例化的类是在运行时刻指定的。
- 避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。
案例1
考试卷纸。
类图
代码
pattrtn05.bulider.demo1
1 | public class ExamPaper implements Cloneable { |
测试输出
1 | public class Main { |
1 | ExamPaper-小明 |
案例2
- 大家合作完成了一个繁琐的项目,由小明写好项目报告;每位同学都需要上交项目报告,其他同学可直接复制;把报告的姓名和学号改为自己的学号姓名。
- 姓名:name
- 学号:number
- 项目报告
类图
无类图
代码
pattern06.prototype.demo2
1 | public class Report implements Cloneable { |
测试输出
1 | public class Main { |
1 | Report-hibiscidai |
补充
浅拷贝
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。
简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象
深拷贝
深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
深拷贝与浅拷贝的区别 :【Java深入】深拷贝与浅拷贝详解