Java设计模式(5)创建型:原型模式

本文介绍了原型模式的概念及其在创建复杂对象时的应用。详细解释了浅复制与深复制的区别,并通过具体示例展示了如何实现这两种复制方式。

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

(一)模式概念

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

原型模式主要面对的问题是:某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

原型模式有两种拷贝情况:浅复制和深复制。

1)浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

2)深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。

现在重新来了解一下基本数据类型和引用数据类型:

基本数据类型 8种:

整型:
byte      1字节
short     2 字节
int       4 字节
long      8 字节
浮点型:
float    4 字节
double   8 字节
Unicode编码的字符单元
char    2 字节
真值类型
boolean    1 位
引用数据类型 3种:

类class 
接口interface 
数组array

(二)Demo

1)浅复制

NativePrototype类原型实例,需实现Cloneable 接口:

public class NativePrototype implements Cloneable {
	public int i = 0; // 基本类型
	public int t = 0; // 基本类型
	public LinkedList<Integer> list = new LinkedList<Integer>(); // 引用类型

	public Object clone() throws CloneNotSupportedException {
		NativePrototype proto = (NativePrototype) super.clone();
		return proto;
	}
}
执行代码:

// 浅复制
NativePrototype np = new NativePrototype();
np.i = 10;
np.list.add(10);
np.t = 10;

NativePrototype npclone = (NativePrototype) np.clone();
np.list.add(11);
System.out.println(npclone.i);
System.out.println(npclone.list);
System.out.println(npclone.t);

执行结果:

10
[10, 11]
10


2)深复制

SerializablePrototype类原型实例,需实现Serializable接口:

public class SerializablePrototype implements Serializable {
	private static final long serialVersionUID = 1L;
	public int i = 0; // 基本类型
	public transient int t = 0;// transient关键字的成员不会被序列化
	public LinkedList<Integer> list = new LinkedList<Integer>(); // 引用类型

	public Object deepClone() throws IOException, ClassNotFoundException {
		/* 写入当前对象的二进制流 */
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(this);
		/* 读出二进制流产生的新对象 */
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis);
		return ois.readObject();
	}
}
执行过程:

// 深复制
SerializablePrototype sp = new SerializablePrototype();
sp.i = 10;
sp.list.add(10);
sp.t = 10;

SerializablePrototype spclone = (SerializablePrototype) sp.deepClone();
sp.list.add(11);
System.out.println(spclone.i);
System.out.println(spclone.list);
System.out.println(spclone.t);

执行结果:

10
[10]
0
(注)此处System.out.println(spclone.t)的值为0是因为SerializablePrototype类中t定义时加了transient,此时复制不会把值也复制过来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值