原型模式

时间:2020-09-16
本文章向大家介绍原型模式,主要包括原型模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

定义

首先创建一个实例,然后通过这个实例去拷贝创建新的实例。

关系

        Student student = new Student("xiaoming", new Bag("nick"));
        Student clone = (Student) student.clone();

通过clone的方式来构造对象

注意的点

1、克隆对象不会调用构造方法

从上面的输出其实我们也可以发现,构造方法只在一开始我们创建原型的时候输出了,fileB和fileC都没有调用构造方法,这是因为执行clone方法的时候是直接从内存中去获取数据的,在第一次创建对象的时候就会把数据在内存保留一份,克隆的时候直接调用就好了

2、访问权限对原型模式无效

原理也很简单,我们是从内存中直接复制的,所以克隆起来也会直接无视,复制相应的内容就好了。

使用场景

当我们的类初始化需要消耗很多的资源时,就可以使用原型模式,因为我们的克隆不会执行构造方法,避免了初始化占有的时间和空间。

深拷贝和浅拷贝

浅拷贝

如果只是调用super.clone()则实现的浅拷贝
只是对于引用类型的成员变量,只是复制的是其引用。

深拷贝

对于深拷贝,引用类型的变量是实现的拷贝的完整的对象,而不是引用地址

public class Student implements Cloneable {

    private String name;

    private Bag bag;

    public Student(String name, Bag bag) {
        this.name = name;
        this.bag = bag;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Bag getBag() {
        return bag;
    }

    public void setBag(Bag bag) {
        this.bag = bag;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student ans = (Student) super.clone();
        ans.setBag((Bag) ans.getBag().clone());
        return ans;
    }
}

public class Bag implements Cloneable {
    private String brand;

    public Bag(String brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

实现深拷贝的方式

除了以上的方式,还有一种经典方式是通过序列化和反序列化,但是由于序列化和反序列化涉及到了文件的操作,所以效率不如重新clone方法的方式。

$flag 上一页 下一页