原型模式

定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

类图

其他

  1. 优点:
    性能优良: 原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多
    逃避构造函数约束(优缺点并存):
  2. 使用场景
    资源优化场景
    性能和安全要求的场景
    一个对象多个修改者的场景
    (实际项目中,很少单独出现,通常和工厂方法模式一起出现)
  3. 对象拷贝时构造函数不执行

浅拷贝和深拷贝

@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一下!

当你准备好了,机会来临的时候,你才能抓住
原文地址:https://www.cnblogs.com/studentytj/p/12405417.html