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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值