原型设计模式谈谈JAVA的深浅拷贝

原型设计模式谈谈JAVA的深浅拷贝

举个例子,衣服(Clothes)有品牌、材质、衣长和衣宽等属性,很多种衣服可能只有品牌不同,其他属性都相同,当我们需要创建这些衣服对象时总是希望在当前对象的基础上修改若干个属性即可,而不需要从零开始创建,这就是原型设计模式的思想------对象拷贝。

@Data
public class Clothes {

	//品牌
	private String brand;
	
	//材质
	private String material;
	
	//衣长
	private double length;
	
	//衣宽
	private double width;
}

1.对象引用拷贝------浅拷贝

对如下代码进行测试,很明显并不能达到我们的预期,一旦修改其中一个对象的属性,另一个对象的属性也会随之改变。

Clothes yourClothes = new Clothes();
yourClothes.setBrand("Zegna");
yourClothes.setMaterial("羊毛");
yourClothes.setLength(0.65);
yourClothes.setWidth(0.45);
Clothes myClothes = yourClothes;
myClothes.setBrand("Adidas");

2.对象克隆拷贝------半拷贝

使用cloneable接口实现对象的拷贝代码如下,结果是符合我们预期的,但是当我们在Clothes对象中添加一个袖子对象(Sleeve),便会发现该对象的拷贝不符合预期,也就是引用类型的对象无法完成拷贝。

@Data
public class Clothes implements Cloneable {

	//品牌
	private String brand;
	
	//材质
	private String material;
	
	//衣长
	private double length;
	
	//衣宽
	private double width;
	
	//袖子
	private Sleeve sleeve;

	@Override
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

3.对象序列化拷贝------深拷贝

使用序列化和反序列化的方式是实现深拷贝最简单的方式,这里我们采用GSON来完成这个操作,具体代码如下

Clothes yourClothes = new Clothes();
yourClothes.setBrand("Zegna");
yourClothes.setMaterial("羊毛");
yourClothes.setLength(0.65);
yourClothes.setWidth(0.45);
Gson gson = new Gson();
Clothes myClothes = gson.fromJson(gson.toJson(yourClothes), Clothes.class);
myClothes.setBrand("Adidas");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值