大话设计模式笔记(六)——原型模式

  • 2019 年 10 月 30 日
  • 笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/76549439

第九章原型模式

在面向对象语言中,解决复制对象而不是复制引用的问题的解决方法是原型模式。

原型模式的UML图

Java中,原型接口是存在的,是Copyable。Clone方法是Object的clone(),不过是protected,使用super.clone()时,必须实现Copyable接口。不然会抛出CloneNotSupportedException异常

例子,原型模式实现深复制:

现有简历类,简历中有工作经历类,通过原型模式实现简历类的复制。

UML图

简历类

public class Resume implements Cloneable{      private int id;      private String name;      private int age;      private String sex;      private WorkExperience workExperience;        public Resume(Stringname) {          this.name = name;          workExperience = new WorkExperience();      }        /** getter、setter */        public void setWorkExperience(StringcomanyName, double workTime) {          this.workExperience.setCompanyName(comanyName);          this.workExperience.setWorkTime(workTime);      }        public Objectclone() {          try {              Resume user = (Resume) super.clone();              user.workExperience= (WorkExperience) workExperience.clone();              return user;          } catch(CloneNotSupportedException e) {              e.printStackTrace();              return null;          }      }    }

工作经验类

public class WorkExperience implements Cloneable{      private StringcompanyName;      private double workTime;        /** getter、setter */        public Objectclone() {          try {              return (WorkExperience)super.clone();          } catch(CloneNotSupportedException e) {              e.printStackTrace();              return null;          }      }  }

client类

public class Client {      public static void main(String[]args) {          Resume zhangsan = new Resume("张三");          zhangsan.setId(1);          zhangsan.setAge(19);          zhangsan.setWorkExperience("XXXX有限公司", 4);            Resume lisi = (Resume) zhangsan.clone();          lisi.setName("李四");          lisi.setWorkExperience("腾讯", 1);            System.out.println(zhangsan.getName() + "," + zhangsan.getAge() + "," + zhangsan.getWorkExperience().getCompanyName() + "/0" + zhangsan.getWorkExperience().getWorkTime());          System.out.println(lisi.getName() + "," + lisi.getAge() + "," + lisi.getWorkExperience().getCompanyName() + "/0" + lisi.getWorkExperience().getWorkTime());      }  }

总结

原型模式是的作用是用来复制对象的。原型模式赋值时不考虑构造细节,所以它比构造效率高。

原始模式的复制涉及深复制和浅复制。浅复制是只复制对象中的基本数据类型,而引用类型只复制引用,实际指向同一个对象。深复制是复制对象中的所有属性。