定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
类图
其他
- 优点:
性能优良: 原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多
逃避构造函数约束(优缺点并存): - 使用场景
资源优化场景
性能和安全要求的场景
一个对象多个修改者的场景
(实际项目中,很少单独出现,通常和工厂方法模式一起出现) - 对象拷贝时构造函数不执行
浅拷贝和深拷贝
@Getter
@Setter
@ToString
public class ShallowClone implements Cloneable {
private List<String> list = new ArrayList<>();
private List<String> val = new ArrayList<>();
@Override
protected ShallowClone clone() throws CloneNotSupportedException {
return (ShallowClone) super.clone();
}
public void setValue(String value) {
val.add(value);
}
public List<String> getValue() {
return val;
}
}
class DeepClone implements Cloneable {
private List<String> val = new ArrayList<>();
@Override
protected DeepClone clone() throws CloneNotSupportedException {
DeepClone clone = (DeepClone) super.clone();
// 深拷贝增加了对私有引用变量的克隆
clone.val = (List<String>) ((ArrayList) this.val).clone();
return clone;
}
public void setValue(String value) {
val.add(value);
}
public List<String> getValue() {
return val;
}
}
class Test {
public static void main(String[] args) throws CloneNotSupportedException {
ShallowClone shallowClone = new ShallowClone();
shallowClone.setList(Collections.singletonList("a"));
shallowClone.setValue("张三");
ShallowClone clone = shallowClone.clone();
clone.setList(Collections.singletonList("b"));
clone.setValue("李四");
System.out.println(shallowClone);
System.out.println(clone);
DeepClone deepClone = new DeepClone();
deepClone.setValue("zhangsan");
DeepClone clone1 = deepClone.clone();
clone1.setValue("lisi");
System.out.printf(deepClone.getValue().toString());
}
}
输出如下:
ShallowClone(list=[a], val=[张三, 李四])
ShallowClone(list=[b], val=[张三, 李四])
[zhangsan]
list的不同是因为改变了clone改变了list的指针。
记住,内部的数组和引用对象是不会被拷贝的,如果你想深拷贝,记得把他们也clone一下!