原型模式 Serializable序列化与反序列化克隆对象

本文介绍原型模式原理及其实现方式,并演示了如何利用序列化与反序列化技术进行对象的深度克隆,包括Person类和Car类的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型模式 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值