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

来源:互联网 发布:win10网络id灰色 编辑:程序博客网 时间:2024/05/17 04:37

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

原创粉丝点击