原型模式 Serializable序列化与反序列化克隆对象
原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。
原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。
原型模式有两种表现形式:(1)简单形式、(2)登记形式,这两种表现形式仅仅是原型模式的不同实现。
创建Person类 含有深度克隆自身的方法:import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
String name;
String id;
Car car;
public Object deepClone() throws IOException, ClassNotFoundException{
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(bs);
obs.writeObject(this);
File file = new File("F:\\test.txt");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream obs2 = new ObjectOutputStream(fos);
obs2.writeObject(this);
obs2.flush();
obs2.close();
fos.close();
System.out.println("长度:" + bs.size());
ByteArrayInputStream bi = new ByteArrayInputStream(bs.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bi);
return ois.readObject();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
创建Car类:
import java.io.Serializable;
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
String carName;
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
}
测试克隆方法:
import java.io.IOException;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, IOException {
Person p = new Person();
p.setName("张三");
p.setId("001");
Car car = new Car();
car.setCarName("奔驰");
p.setCar(car);
Person newP = (Person) p.deepClone();
System.out.println(newP.getName()+ ", " + newP.getCar().getCarName());
System.out.println(p == newP );
System.out.println(car == newP.getCar());
}
}
输出内容:
长度:189
张三, 奔驰
false
false