原型模式的定义与特点
*原型(Prototype)模式: * 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象
- 通俗的说就是对已存在的对象进行对象复制
结构
- 抽象原型类: 规定了具体原型对象必须实现的接口
- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象
- 访问类: 使用具体原型类中的 clone() 方法来复制新的对象
实现
通过Java提供的对象的clone()方法实现
原型模式的克隆分为浅克隆和深克隆
*浅克隆: *
使用java提供的clone()方法,原型类实现Cloneable接口重写clone()方法然后调用clone()方法即可复制对象
如果原型类存在引用类型(对象)成员属性,浅克隆不会直接复制对象成员属性,需要该对象类也实现Cloneable接口才行
*深克隆: *序列化实现深克隆,使用对象流把对象写入流中,再从流中读取实现复制对象,原型类需实现Serializable接口,对于不想被序列化的属性需要使用transient修饰
//具体原型类
class RealizeType implements Cloneable,Serializable{
//public Student student;//引用类型,如果Student类没有实现Cloneable接口,浅克隆不会复制
public RealizeType() {
System.out.println("原型对象创建成功!");
}
//浅克隆: 实现Cloneable接口,重写clone方法
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("原型对象浅克隆成功");
return super.clone();
}
//深克隆: 实现Serializable接口,将对象写入流中再取出
public RealizeType deepClone(){
//序列化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (ObjectOutputStream output = new ObjectOutputStream(byteArrayOutputStream)) {
output.writeObject(this);
}catch(IOException e){
e.printStackTrace();
}
//反序列化
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
RealizeType obj = null;
try (ObjectInputStream input = new ObjectInputStream(byteArrayInputStream)) {
obj = (RealizeType) input.readObject();
}catch (IOException | ClassNotFoundException e){
e.printStackTrace();
}
System.out.println("原型对象深克隆成功");
return obj;
}
}
@Test //测试
public void prototype() throws CloneNotSupportedException {
//浅拷贝
RealizeType obj = new RealizeType();
RealizeType clone = (RealizeType) obj.clone();
//深拷贝
RealizeType deepClone = obj.deepClone();
}