设计模式之03:原型模式

用样板实例“克隆”出一个新的实例。

优点: 原型模式是内存中二进制流的拷贝,对于复杂对象来说,比直接new一个对象性能好;
缺点:直接在内存中拷贝,不会执行构造函数,实际开发中需注意⚠️。

使用场景

  1. 类初始化需要消耗非常多的资源(数据、内存资源等),通过原型拷贝避免资源消耗。
  2. new一个对象需要过多数据准备或访问权限时。

常用实现

  1. 实现Cloneable接口,重写对象的clone()方法;
public class Test implements Cloneable {

    public Test() {
        System.out.print("我是构造方法,我会被执行吗?");
    }

    private long id;
    private String name;
    private ArrayList 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) this.addressList.clone();
            return test;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

}

注意:深拷贝与浅拷贝的却别。

  1. 拷贝构造函数
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 addressList = new ArrayList<>();

    @Override
    protected Test clone() {
        return new Test(this);
    }

}

总结

  1. clone并不一定比new的效率高,需要效率测试验证;
  2. clone时需要注意构造函数不执行的问题;
  3. 深拷贝与浅拷贝的使用;

你可能感兴趣的:(设计模式之03:原型模式)