概念
- 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
- 优缺点:
性能优良:原型模式是在内存二进制流的拷贝,比直接new一个对象性能要好很多
逃避构造函数的约束(既是优点也是缺点) - 适用场景:
资源优化场景:类的初始化需要耗费非常多的资源的情况
性能和安全要求的场景:new一个对象需要繁琐的数据准备或者访问权限的情况
一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以拷贝多个对象供调用者使用,即保护性拷贝
代码实现
- 浅拷贝
@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);
}
}
- 深拷贝
@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);
}
}
知识点
- 深拷贝和浅拷贝的区别:
深拷贝:对基本数据类型进行值传递,对引用数据类型只拷贝其内存地址
浅拷贝:对基本数据类型进行值传递,对引用数据类型开辟一个新的内存地址去存储拷贝的数据
来源:CSDN
作者:❤️大米花❤️
链接:https://blog.csdn.net/qq_28032223/article/details/104036435