原型模式:
- 定义 : 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.(主要用于对象的复制).
- 要被复制的原型类(Prototype)需要具备的条件
- 实现Cloneable接口.在JAVA中有一个Cloneable接口,他唯一的作用就是在运行时通知虚拟机可以安全的在实现了此接口的类上使用clone方法.在JAVA虚拟机中,只有实现了Cloneable接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常
- 重写Object类中的clone方法.在JAVA中.所有类的父类都是Object类,Object类中有一个clone方法.作用是返回对象的一个拷贝.但是其作用域是protected的,一般的类是无法调用的,所以在Prototype类重写clone方法时需要将作用域修改为public类型.
- 优点
- 使用原型模式创建对象比直接new一个对象在性能上要好的多.这是因为Object类的clone方法时一个本地方法.他直接操作内存中的二进制流.这点在复制复杂或者耗时的实例时,性能差别非常明显.
- 简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单.
- 使用场景
- 类初始化需要消耗相当多的资源,包括数据,硬件资源等
- 有性能和安全要求的场景.
- 通过new产生一个对象需要非常繁琐的数据准备和访问权限时
- 一个对象需要提供给其它对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用.
- 注意事项
- 原型模式时通过拷贝一个现有的对象生成新对象的,这点和通过一个类进行实例化来构造新对象不同.
- 使用原型模式复制对象不会调用类的构造函数,这是一位对象的复制是通过Object类中的clone方法来完成的.所以该类的构造方法中的代码不会执行.即使该类的构造函数是private也同样可以在实现了原型模式的类中获取复制后的类,这个和单例模式冲突.
- 浅拷贝实现Cloneable重写clone方法,深拷贝是通过实现Serializable读取二进制流.
- 浅拷贝,即Object类中的clone方法只会拷贝对象中的基本的数据类型,对于数组,容器对象,引用对象都不会拷贝,如果要实现深拷贝,必须将原型模式汇总的数组,容器对象,引用对象等另行拷贝.
代码实现
其实原型模式直接就可以理解为,
实现了一个Cloneable接口,重写了一个Object类的clone方法.就实现了原型模式.
浅拷贝
package Prototype;
/**
* Created by looper on 2017/8/15.
*/
//1.继承Cloneable接口
public class Prototype implements Cloneable {
//2.重写Object类的clone方法.
public Object clone() throws CloneNotSupportedException {
Prototype prototype = (Prototype) super.clone();
return prototype;
}
}
深拷贝
package Prototype;
import java.util.ArrayList;
/**
* Created by looper on 2017/8/15.
*/
//1.继承Cloneable接口
public class Prototype implements Cloneable {
private ArrayList list = new ArrayList<>();
//但是有一个问题,习惯性的经常使用List接口来代替ArrayList
// private List list = new ArrayList<>();
//2.重写Object类的clone方法.
public Object clone() throws CloneNotSupportedException {
Prototype prototype = (Prototype) super.clone();
//将不是基本数据类型的另行拷贝,(当使用List代替ArrayList时,没有clone方法)
prototype.list = (ArrayList)this.list.clone();
return prototype;
}
}
我将23种设计模式的全部代码上传到优快云,有用得到的同学 可以去下载.
下载地址 : 点我