在我们应用程序可能有某些对象的结构比较复杂,但是我们又需要频繁的使用它们,如果这个时候我们来不断的新建这个对象势必会大大损耗系统内存的,这个时候我们需要使用原型模式来对这个结构复杂又要频繁使用的对象进行克隆。
所以原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
大白话:就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象
![](https://img.haomeiwen.com/i8576307/666dea1fd3d6ac5a.png)
原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象是可拷贝的,为什么说是"标识" 呢? 翻开JDK的帮助看Cloneable是一个方法都没有的, 这个接口只是一个标记作用,在JVM中具有这个标记的对象才有可能被拷贝. 如何从"有可能被拷贝" 转换成"可以被拷贝"呢?方法是覆盖 clone 方法.
原型模式的通用代码:
![](https://img.haomeiwen.com/i8576307/ea2a3b2ae2c215d0.png)
原型模式的应用
a)原型模式的优点
(1)性能优良。原型模式是在内存二进制流的拷贝, 要比直接new 一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好的体现其优点
(2)逃避构造函数的约束。 这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的. 优点是减少了约束, 缺点也是减少了约束, 需要在实际应用时考虑
b)原型模式的使用场景
(1)资源优化场景。 类初始化需要消化非常多的资源, 这个资源包括数据、硬件资源等
(2)性能和安全要求的场景。通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式
(3)一个对象多个修改者的场景。 一个对象需要提供给其它对象访问, 而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用.
在实际项目中,原型模式很少单独出现, 一般是和工厂方法模式一起出现, 通过clone的方法创建一个对象, 然后由工厂方法提供给调用者。
浅复制和深复制,更多查看
浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。
深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝
也就是说浅拷贝只复制一个对象,传递引用,不能复制实例。
而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例。
对于浅拷贝当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。但是当对象的成员变量是引用数据类型时,就不能实现对象的复制了。
//浅复制例子
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
//深复制例子
publicObject clone()throws CloneNotSupportedException{
Student newStudent = (Student)super.clone();
newStudent.professor = (Professor) professor.clone();
return newStudent;
}
网友评论