原型模式
1、结构
原型类必须实现一个标示接口Cloneable,表示这个类支持复制,否则调用clone方法会报CloneNotSupportException异常。
2、浅克隆和深克隆
(1)浅克隆
被复制对象的所有变量都与原来的对象相同,而所有对其他对象的引用都指向原来的对象。
(2)深克隆
深克隆不仅被复制的所有变量与原理啊对象相同,而且其他对象的引用也会被创建一个新对象。
3、代码
原型类
public class Prototype implements Cloneable {
private ArrayList list = null;
public Prototype() {
super();
list = new ArrayList();
for(int i = 0; i < 10000; i++){
list.add("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+i);
}
}
@Override
protected Object clone() throws CloneNotSupportedException {
Prototype p = null;
p = (Prototype)super.clone();
p.list=(ArrayList)this.list.clone();
return p;
}
public ArrayList getList() {
return list;
}
public void setList(ArrayList list) {
this.list = list;
}
}
原型子类
public class ConcretePrototype extends Prototype implements Serializable{
public void show(){
System.out.println("原形模型实现类-->"+this);
}
/**
* 通过串行化实现深度克隆
* @return
* @throws Exception
*/
public Object deepClone() throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
}
测试类
public class Client {
/**
* 原型模式测试
* 通过测试通过clone获得10000个对象用时516毫秒,通过new方法获得10000个对象用时42047毫秒,第三种deepClone获得10000个对象用时41880毫秒。
* 因此
* 1、性能好:
* 通过clone获得对象要比new获得一个对象在性能上好的多。
* 主要是在对象构造方法中存在大量的数据处理,而clone过程是二进制流的拷贝,不会执行构造方法
* 2、简化对象的操作
* 只要通过clone方法就可以获得一个新的对象。(并且属性和主对象一致)
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) throws CloneNotSupportedException {
Date start = new Date();
ConcretePrototype prototype = new ConcretePrototype();
for(int i = 0; i < 10000; i++){
// ConcretePrototype p = (ConcretePrototype)prototype.clone();
// ConcretePrototype p = new ConcretePrototype();
ConcretePrototype p = null;
try {
p = (ConcretePrototype)prototype.deepClone();
} catch (Exception e) {
e.printStackTrace();
}
p.show();
}
Date end = new Date();
System.out.println(end.getTime() - start.getTime());
}
}
4、总结
(1)、性能好:
通过clone获得对象要比new获得一个对象在性能上好的多。
主要是在对象构造方法中存在大量的数据处理,而clone过程是二进制流的拷贝,不会执行构造方法
(2)、简化对象的操作
只要通过clone方法就可以获得一个新的对象。(并且属性和主对象一致)