zoukankan      html  css  js  c++  java
  • 原型模式--简历复印

      原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

      

    浅复制:

       被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
        如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用,不复制引用的对象。因此,原始句柄及其复本引用同一对象。

     1 //工作经历类
     2 public class WorkExperience {
     3     //工作时间
     4     private String workDate;
     5     
     6     //工作公司
     7     private String company;
     8 
     9     public String getWorkDate() {
    10         return workDate;
    11     }
    12 
    13     public void setWorkDate(String workDate) {
    14         this.workDate = workDate;
    15     }
    16 
    17     public String getCompany() {
    18         return company;
    19     }
    20 
    21     public void setCompany(String company) {
    22         this.company = company;
    23     }
    24 }
     1 //简历类
     2 public class Resume implements Cloneable{
     3     private String name;
     4     private String sex;
     5     private String age;
     6 
     7     // 引用"工作经历"对象
     8     private WorkExperience work;
     9 
    10     // 构造方法
    11     public Resume(String name) {
    12         this.name = name;
    13         work = new WorkExperience();
    14     }
    15 
    16     // 设置个人信息
    17     public void setPersonalInfo(String sex, String age) {
    18         this.sex = sex;
    19         this.age = age;
    20     }
    21 
    22     // 设置工作经历
    23     public void setWorkExperience(String workDate, String company) {
    24         //调用此方法时,给对象的两属性赋值
    25         work.setWorkDate(workDate);
    26         work.setCompany(company);
    27     }
    28 
    29     // 显示
    30     public void display() {
    31         System.out.println(name + ":" + sex + ":" + age);
    32         // 显示时,显示工作经历的两个属性
    33         System.out.println("工作经历:" + work.getWorkDate() + work.getCompany());
    34     }
    35 
    36     //复制对象,浅复制
    37     public Resume clone() {
    38         Object obj = null;
    39         try{
    40             obj = super.clone();
    41             return (Resume) obj;
    42         }catch (CloneNotSupportedException e){
    43             System.out.println("不支持复制!");
    44             return null;
    45         }
    46     }
    47 }

    测试类:

     1 /**
     2  * 如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用,不复制引用的对象。因此,原始句柄及其复本引用同一对象。
     3  * @author 贤元
     4  *
     5  */
     6 public class Test {
     7     public static void main(String[] args) {
     8         Resume a = new Resume("大鸟");
     9         a.setPersonalInfo("男", "29");
    10         a.setWorkExperience("1988-2000", " xx公司");
    11         
    12         Resume b = (Resume) a.clone();
    13         b.setWorkExperience("1988-2003", " yy公司");
    14         
    15         Resume c = (Resume) a.clone();
    16         c.setWorkExperience("1988-2006", " zz公司");
    17         
    18         a.display();
    19         b.display();
    20         c.display();
    21         
    22         /**
    23          * 打印结果如下:
    24          *  大鸟:男:29
    25             工作经历:1988-2006 zz公司
    26             大鸟:男:29
    27             工作经历:1988-2006 zz公司
    28             大鸟:男:29
    29             工作经历:1988-2006 zz公司
    30 
    31          */
    32     }
    33 }

    UML图:

      

    深复制:

      把引用对象的变量指向复制过的新对象,而不是原有被引用的对象。

      原引用和新引用指向的不是同一个对象,原引用继续指向原来的旧对象,而新引用指向复制过后的新对象(该对象和旧对象中的数据是一样的,但是,该对象不是旧对象,和旧对象是两个完全独立的对象)。

     1 //工作经历
     2 public class WorkExperience implements Cloneable{
     3     //工作时间
     4     private String workDate;
     5     //工作公司
     6     private String company;
     7     public String getWorkDate() {
     8         return workDate;
     9     }
    10     public void setWorkDate(String workDate) {
    11         this.workDate = workDate;
    12     }
    13     public String getCompany() {
    14         return company;
    15     }
    16     public void setCompany(String company) {
    17         this.company = company;
    18     }
    19     
    20     //注意这里有点不同
    21     public WorkExperience clone() {
    22         Object obj = null;
    23         try{
    24             obj = super.clone();
    25             return (WorkExperience) obj;
    26         }catch (CloneNotSupportedException e){
    27             System.out.println("不支持复制!");
    28             return null;
    29         }
    30     }
    31     
    32 }
     1 //简历类
     2 public class Resume implements Cloneable {
     3     private String name;
     4     private String sex;
     5     private String age;
     6 
     7     // 引用“工作经历”对象
     8     private WorkExperience work;
     9 
    10     // 构造方法
    11     public Resume(String name) {
    12         this.name = name;
    13         work = new WorkExperience();
    14     }
    15     
    16     //构造方法
    17     private Resume(WorkExperience work){
    18         //提供clone方法调用的私有构造函数,以便克隆"工作经历"的数据
    19         this.work = (WorkExperience)work.clone();
    20     }
    21 
    22     // 设置个人信息
    23     public void setPersonalInfo(String sex, String age) {
    24         this.sex = sex;
    25         this.age = age;
    26     }
    27 
    28     // 设置工作经历
    29     public void setWorkExperience(String workDate, String company) {
    30         // 调用此方法时,给对象的两属性赋值
    31         work.setWorkDate(workDate);
    32         work.setCompany(company);
    33     }
    34 
    35     // 显示
    36     public void display() {
    37         System.out.println(name + ":" + sex + ":" + age);
    38         // 显示时,显示工作经历的两个属性
    39         System.out.println("工作经历:" + work.getWorkDate() + work.getCompany());
    40     }
    41     
    42     //进行"深复制"克隆Resume对象
    43     public Resume clone(){
    44         //调用私有的构造方法,让“工作经历”克隆完成,然后再给这个“简历”对象的相关字段赋值,最终返回一个深复制的简历对象。
    45         Resume obj = new Resume(this.work);
    46         obj.name = this.name;
    47         obj.sex = this.sex;
    48         obj.age = this.age;
    49         
    50         //以上四行代码是重新封装一个一模一样的Resume对象,内容是一样的,但是他们的引用指向的是两个独立的对象,就相当于复制的不是引用,而是一个完整的对象
    51         return obj;
    52     }
    53 
    54 }

    测试类:

     1 /**
     2  * 如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用,不复制引用的对象。因此,原始句柄及其复本引用同一对象。
     3  * @author 贤元
     4  *
     5  */
     6 public class Test {
     7     public static void main(String[] args) {
     8         Resume a = new Resume("大鸟");
     9         a.setPersonalInfo("男", "29");
    10         a.setWorkExperience("1988-2000", " xx公司");
    11         
    12         Resume b = a.clone();//深复制
    13         b.setWorkExperience("1988-2003", " yy公司");
    14         
    15         Resume c =  a.clone();//深复制
    16         c.setWorkExperience("1988-2006", " zz公司");
    17         
    18         a.display();
    19         b.display();
    20         c.display();
    21         
    22         /**
    23          * 打印结果如下:
    24          *  大鸟:男:29
    25             工作经历:1988-2000 xx公司
    26             大鸟:男:29
    27             工作经历:1988-2003 yy公司
    28             大鸟:男:29
    29             工作经历:1988-2006 zz公司
    30 
    31          */
    32     }
    33 }

     UML图:

      

  • 相关阅读:
    Latex文件如何拆分进行独立编译?
    梯度下降优化算法
    Google大脑科学家贾杨清(Caffe缔造者)-微信讲座
    Jeecg 如何执行批量insert或者update操作,高效率
    【JEECG_3.7.1】列表多表头的设计
    t:formvalid中定义callback函数
    Excel导入的时候日期格式会变成double式的String数据处理
    sql 跨表修改的方式
    js判断字符串str是否包含字符串substr
    帆软报表和jeecg的进一步整合--ajax给后台传递map类型的参数
  • 原文地址:https://www.cnblogs.com/lixianyuan-org/p/9492299.html
Copyright © 2011-2022 走看看