术语快速解释
其实原型模式说白了就是克隆,用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。
为什么能保证性能?
是因为,原型模式是在内存中的二进制流的拷贝要比直接new好,特别是要在一个很大的循环体中产生大量对象的时候,你觉得是直接复制好,还是执行一次循环再获取一次要来的快?答案显而易见。但是它也有一个显著的缺点,那就是既然是直接在内存中拷贝,那么就根本不会执行构造函数,因为构造函数是用来初始化类的,而你是直接拷贝。所以需要注意这点
原型模式使用方式
克隆有两种方式浅克隆,和深克隆,当然这里介绍原型模式用到简单的深克隆。具体两者区别及高级用法用法请移步,不是这里介绍的重点
实现步骤:
- 被复制的类需要实现Clonenable接口, 该接口为标记接口(不含任何方法)
- 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。
- 将得到的复制对象返回,如果对象中有引用对象那么对引用对象再克隆一次。
class Student implements Cloneable{
private int number;
private ArrayList<String> image = new ArrayList<String>();
public int getNumber() {
return number;
}
public int getImage() {
return image;
}
public void setNumber(int number) {
this.number = number;
}
public void setImage(String url) {
this.image.add(url);
}
@Override
public Object clone() {
Student stu = null;
try{
stu = (Student)super.clone();
stu.number=this.number;
//引用对象再次克隆
stu.image=this.image.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return stu;
}
}
原型模式有两种用途
第一种:
当直接创建对象的代价比较大时(比如要进行网络操作获取、数据库操作之类的消耗资源时间的操作),则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
第二种:
这也是一个比较重要的用途,那就是保护性用途,也就是某个对象对外只可读,为了防止这个只读对象被修改,通常可以通过返回给一个对象的拷贝的形式实现可读。
拿我们生活中的例子来说就是,你有一份重要的文件,想给别人看,但是那个人你不知道他会不会对你文件动手脚,改文字之类的,或者撕掉你的文件。这个时候你就可以去打印店复制一份给他,这样他改了也不影响你原文件。