原型设计模式谈谈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");