《大话设计模式》之原型模式

本文介绍了Java中浅拷贝与深拷贝的概念及其实现方式。通过具体示例对比了两种拷贝方式的区别,浅拷贝仅复制对象本身,而深拷贝会递归复制对象的所有成员变量。

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

1.定义

用原型实例制定创建对象的种类,并通过拷贝这些原型创建新的对象,用于创建重复的对象,同时又能保证性能。实现克隆操作,在 JAVA 继承 Cloneable,重写 clone()。

不用重新初始化对象,而是动态地获得对象运行时的状态。

浅拷贝和深拷贝

如果字段是值类型的,则对该字段执行逐位复制;
如果字段是引用类型的,则复制引用但是不复制引用的对象,原始对象及其复本引用同一对象。

浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。
深拷贝:把引用对象的变量执行复制过的新对象,而不是原有的被引用的对象。

2.实现

2.1浅拷贝

public class WordExperience {
    String workDate;
     String company;    
}
public class Resume implements Cloneable  {
    private String name;//值类型
    private String sex;//值类型
    private String age;//值类型
    private WordExperience work;//引用类型

     public Resume(String name) {
         this.name=name;
         work=new WordExperience();
     }
     @Override  
     public Resume clone() throws CloneNotSupportedException {  
         return (Resume) super.clone();     
     }

    public void Display() {
        System.out.print("name:"+name+",sex:"+sex+",age:"+age);
        System.out.println(",work.workDate:"+work.workDate+",work.company:"+work.company);
    }

    public void SetPersonalInfo(String sex, String age) {
        this.sex=sex;
        this.age=age;

    }

    public void SetWordExperience(String timeArea, String company) {
        work.workDate=timeArea;
        work.company=company;
    }

}
    public static void main(String[] args) throws CloneNotSupportedException {
        Resume a=new Resume("ting");
        a.SetPersonalInfo("man", "29");
        a.SetWordExperience("1998-2000", "A");

        Resume b=(Resume)a.clone();
        b.SetPersonalInfo("woman", "30");
        b.SetWordExperience("2000-2016", "B");

        a.Display();
        b.Display();    
    }

输出:
name:ting,sex:man, age:29,work.workDate:2000-2016,work.company:B
name:ting,sex:woman,age:30,work.workDate:2000-2016,work.company:B
工作经验都是显示最后一次设置的值,而sex与age能分别显示。

2.2深拷贝

public class WordExperience implements Cloneable{
    public String workDate;
    public String company;
    @Override//"工作经验实现克隆方法"
    public WordExperience clone() throws CloneNotSupportedException {
        return (WordExperience)super.clone();
    }
}
public class Resume implements Cloneable  {
    private String name;
    private String sex;
    private String age;
    private WordExperience work;

     public Resume(String name) {
         this.name=name;
         work=new WordExperience();
     }
     public  Resume(WordExperience wrok) throws CloneNotSupportedException {
         this.work=wrok.clone();
     }
     @Override  
     public Resume clone() throws CloneNotSupportedException {  
         Resume resume=new Resume(this.work);
         resume.name=name;
         resume.sex=sex;
         resume.age=age;
           return resume;  
     }

    public void Display() {
        System.out.print("name:"+name+",sex:"+sex+",age:"+age);
        System.out.println(",work.workDate:"+work.workDate+",work.company:"+work.company);
    }

    public void SetPersonalInfo(String sex, String age) {
        this.sex=sex;
        this.age=age;

    }

    public void SetWordExperience(String workDate, String company) {
        work.workDate=workDate;
        work.company=company;
    }

}
    public static void main(String[] args) throws CloneNotSupportedException {
        Resume a=new Resume("daniao");
        a.SetPersonalInfo("man", "29");
        a.SetWordExperience("1998-2000", "ting");

        Resume b=(Resume)a.clone();
        b.SetWordExperience("2000-2016", "ben");

        a.Display();
        b.Display();


    }
}

输出:
name:daniao,sex:man,age:29,work.workDate:1998-2000,work.company:ting
name:daniao,sex:man,age:29,work.workDate:2000-2016,work.company:ben

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值