用样板实例“克隆”出一个新的实例。
优点: 原型模式是内存中二进制流的拷贝,对于复杂对象来说,比直接new一个对象性能好;
缺点:直接在内存中拷贝,不会执行构造函数,实际开发中需注意⚠️。
使用场景
- 类初始化需要消耗非常多的资源(数据、内存资源等),通过原型拷贝避免资源消耗。
- new一个对象需要过多数据准备或访问权限时。
常用实现
- 实现
Cloneable
接口,重写对象的clone()
方法;
public class Test implements Cloneable {
public Test() {
System.out.print("我是构造方法,我会被执行吗?");
}
private long id;
private String name;
private ArrayList<String> addressList = new ArrayList<>();
@Override
protected Test clone() {
try {
Test test = (Test) super.clone();
test.id = this.id;
test.name = this.name;
//浅拷贝:每个对象修改addressList都会引起其它对象中addressList的变化
//test.addressList = this.addressList;
//深拷贝
test.addressList = (ArrayList<String>) this.addressList.clone();
return test;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
注意:深拷贝与浅拷贝的却别。
- 拷贝构造函数
public class Test implements Cloneable {
public Test(Test source) {
this.id = source.id;
this.name = source.name;
this.addressList = new ArrayList<>(source.addressList);
}
private long id;
private String name;
private ArrayList<String> addressList = new ArrayList<>();
@Override
protected Test clone() {
return new Test(this);
}
}
总结
- clone并不一定比new的效率高,需要效率测试验证;
- clone时需要注意构造函数不执行的问题;
- 深拷贝与浅拷贝的使用;
网友评论