1、原型模式(Prototype)
就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象,
在java中,复制对象是通过clone()实现的,很简单,一个原型类,只需要实现Cloneable接口,
覆写clone方法,此处clone方法名称可以改成任意的名称,因为Cloneable接口是个空接口,
你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone(),他调用的是
Object中的clone()方法(clone()方法属于native方法)。
首先我们需要了解对象的深浅赋值概念:
浅赋值:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深赋值:将一个对象复制后,不论是基本数据类型还是引用类型,都会重新创建。(要实现深复制,需要采用流的形式
写出当前对象的二进制输入,再读入二进制数据对象的对象。)
实例一:(创建原型类)
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
// 浅复制
public Object lightClone() throws CloneNotSupportedException {
return super.clone();
}
// 深复制
public Object deepClone() throws Exception {
// 采用流的形式写出当前对象的二进制
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 读入二进制流从而产生新对象
final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
final ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
实例二:(通过原型模式比较浅复制 与深复制)
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private Person person = new Person();
private int pass = 123;
public Person getPerson() {
return this.person;
}
public void setPerson(final Person person) {
this.person = person;
}
public int getPass() {
return this.pass;
}
public void setPass(final int pass) {
this.pass = pass;
}
// 浅复制
public Object lightClone() throws CloneNotSupportedException {
return super.clone();
}
// 深复制
public Object deepClone() throws Exception {
// 采用流的形式写出当前对象的二进制
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 读入二进制流从而产生新对象
final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
final ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public static void main(final String[] args) throws Exception {
// 浅复制对象比对
final Prototype pro = new Prototype();
final Prototype pro2 = (Prototype) pro.lightClone();
pro.setPass(456);
pro.getPerson().age = 90;
System.out.println(pro + " " + pro.getPerson().age + " " + pro.getPass());
System.out.println(pro2 + " " + pro2.getPerson().age + " " + pro2.getPass());
// 深复制对象比对
final Prototype pro12 = new Prototype();
final Prototype pro22 = (Prototype) pro12.deepClone();
pro12.setPass(456);
pro12.getPerson().age = 90;
System.out.println(pro12 + " " + pro12.getPerson().age + " " + pro12.getPass());
System.out.println(pro22 + " " + pro22.getPerson().age + " " + pro22.getPass());
}
}
class Person implements Serializable {
private static final long serialVersionUID = 1L;
public int age = 12;
}