栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【设计模式】原型模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【设计模式】原型模式

java原生浅克隆

@Data
public class Cat1 implements Cloneable {
    private String color;
    private String name;
    private Dog1 dog;

    @Override
    public Object clone() throws CloneNotSupportedException {
        Cat1 cat = (Cat1) super.clone();
        return cat;
    }
}
@Data
public class Dog1{
    private String color;
    private String name;

    public Dog1(String color, String name) {
        this.color = color;
        this.name = name;
    }
}

java原生深克隆

@Data
public class Cat implements Cloneable {
    private String color;
    private String name;
    private Dog dog;

    @Override
    public Object clone() throws CloneNotSupportedException {
        Cat cat = (Cat) super.clone();
        cat.dog= (Dog) dog.clone();
        return cat;
    }
}
@Data
public class Dog implements Cloneable{
    private String color;
    private String name;

    public Dog(String color, String name) {
        this.color = color;
        this.name = name;
    }

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

hutool深克隆

@Data
public class Bird implements Serializable{
    private String color;
    private String name;
    private Bird3 bird3;

    public Bird(String color, String name) {
        this.color = color;
        this.name = name;
    }
}
@Data
public class Bird3 implements Serializable{
    private String color;
    private String name;

    public Bird3(String color, String name) {
        this.color = color;
        this.name = name;
    }
}

测试

//浅克隆
Cat1 cat1 = new Cat1();
cat1.setColor("白色");
cat1.setName("小白");
cat1.setDog(new Dog1("白","狗"));
Cat1 cat2 = (Cat1) cat1.clone();
cat2.setColor("蓝色");
cat2.setName("小蓝");
cat2.getDog().setName("天空");
System.out.println(cat1);
System.out.println(cat2);

//深克隆
Cat cat3 = new Cat();
cat3.setColor("白色");
cat3.setName("小白");
cat3.setDog(new Dog("白","狗"));
Cat cat4 = (Cat) cat3.clone();
cat4.setColor("蓝色");
cat4.setName("小蓝");
cat4.getDog().setName("天空");
System.out.println(cat3);
System.out.println(cat4);

//hutool流克隆
Bird bird1 = new Bird("黄色", "鹦鹉");
bird1.setBird3(new Bird3("小黄","鹦鹉儿子"));
Bird bird2 =  ObjectUtil.cloneByStream(bird1);
bird2.getBird3().setName("鹦鹉儿子copy");

测试结果

Cat1(color=白色, name=小白, dog=Dog1(color=白, name=天空))
Cat1(color=蓝色, name=小蓝, dog=Dog1(color=白, name=天空))
Cat(color=白色, name=小白, dog=Dog(color=白, name=狗))
Cat(color=蓝色, name=小蓝, dog=Dog(color=白, name=天空))
Bird(color=黄色, name=鹦鹉, bird3=Bird3(color=小黄, name=鹦鹉儿子))
Bird(color=黄色, name=鹦鹉, bird3=Bird3(color=小黄, name=鹦鹉儿子copy))

总结

 1.原型模式是一种对象模型快速复制的技术。
 2.浅克隆仅仅复制所考虑的对象,不会复制它所引用的成员对象(地址复用)。
 3.java原生深拷贝,需要引用的成员变量实现Cloneable接口与clone方法。克隆类需要克隆本身及其成员变量。
  @Override
    public Object clone() throws CloneNotSupportedException {
        Cat cat = (Cat) super.clone();
        cat.dog= (Dog) dog.clone();
        return cat;
    }
 4.序列化技术实现深克隆:序列化(Serialization)就是将对象写到流的过程,写到流中的对象是原有的对象的一个拷贝,而原对象仍存在内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且也可以复制其引用的成员对象,因此通过序列化将对象写入一个流中,再从流中将其读出来,从而实现深克隆
	案例:(obj及其引用的成员变量实现Serializable)
 		  ObjectUtil.cloneByStream(obj)
 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1007667.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号