原型模式

好久不见. 提交于 2020-01-19 11:37:37

概念

  1. 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
  2. 优缺点:
    性能优良:原型模式是在内存二进制流的拷贝,比直接new一个对象性能要好很多
    逃避构造函数的约束(既是优点也是缺点)
  3. 适用场景:
    资源优化场景:类的初始化需要耗费非常多的资源的情况
    性能和安全要求的场景:new一个对象需要繁琐的数据准备或者访问权限的情况
    一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以拷贝多个对象供调用者使用,即保护性拷贝

代码实现

  1. 浅拷贝
@Data
class Attachment {
  private String name;
}

@Data
public class Mail implements Cloneable {
  private String receiver;
  private Attachment attachment;

  @Override
  protected Mail clone() {
    Mail cloneMail = null;
    try {
      cloneMail = (Mail) super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return cloneMail;
  }
}

public class Client {
  public static void main(String[] args) {
    Mail mail = new Mail();
    mail.setReceiver("Hua Lee");
    Attachment attachment = new Attachment();
    attachment.setName("new Attachment");
    mail.setAttachment(attachment);
    Mail cloneMail1 = mail.clone();
    cloneMail1.setReceiver("Feng Hu");
    cloneMail1.getAttachment().setName("new Attachment2");
    System.out.println(cloneMail1);
    Mail cloneMail2 = mail.clone();
    System.out.println(cloneMail2);
  }
}

在这里插入图片描述

  1. 深拷贝
@Data
class Attachment implements Cloneable {
  private String name;

  @Override
  protected Attachment clone() {
    Attachment cloneAttachment = null;
    try {
      cloneAttachment = (Attachment) super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return cloneAttachment;
  }
}

@Data
public class Mail implements Cloneable {
  private String receiver;
  private Attachment attachment;

  @Override
  protected Mail clone() {
    Mail cloneMail = null;
    try {
      cloneMail = (Mail) super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    cloneMail.attachment = attachment.clone();
    return cloneMail;
  }
}

public class Client {
  public static void main(String[] args) {
    Mail mail = new Mail();
    mail.setReceiver("Hua Lee");
    Attachment attachment = new Attachment();
    attachment.setName("new Attachment");
    mail.setAttachment(attachment);
    Mail cloneMail1 = mail.clone();
    cloneMail1.setReceiver("Feng Hu");
    cloneMail1.getAttachment().setName("new Attachment2");
    System.out.println(cloneMail1);
    Mail cloneMail2 = mail.clone();
    System.out.println(cloneMail2);
  }
}

在这里插入图片描述

知识点

  1. 深拷贝和浅拷贝的区别:
    深拷贝:对基本数据类型进行值传递,对引用数据类型只拷贝其内存地址
    浅拷贝:对基本数据类型进行值传递,对引用数据类型开辟一个新的内存地址去存储拷贝的数据
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!