什么是原型模式

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

代码实例

public class Prototype implements Cloneable {

    private String name;
    private Integer age;

    public Prototype(String name, Integer age) {
        this.name = name;
        this.age = age;
        System.out.println("正在创建");
    }

    @Override
    protected Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        Prototype p = new Prototype("张三", 18);
        System.out.println(p.name + "," + p.age);
        Prototype clone = p.clone();

        System.out.println(clone.name + "," + clone.age);//张三,18
        System.out.println("对象引用一致吗?" + (clone == p));//false
        System.out.println("String属性引用一致吗?" + (clone.name == p.name));//true
        clone.name="李四";
        System.out.println(p.name + "," + p.age);//张三,18
        System.out.println(clone.name + "," + clone.age);//李四,18
        System.out.println(clone.name == p.name);//false
    }
}

原型模式实际上就是实现Cloneable接⼝,重写clone()⽅法。

  • 性能优良
    原型模式是在内存⼆进制流的拷⻉,要⽐直接new⼀个对象性能好很多,特别是 要在⼀个循环体内产⽣⼤量的对象时,原型模式可以更好地体现其优点。

  • 逃避构造函数的约束
    这既是它的优点也是缺点,直接在内存中拷⻉,构造函数是不会执⾏的。

使用场景

  • 资源优化场景类初始化需要消化⾮常多的资源,这个资源包括数据、硬件资源等。

  • 性能和安全要求的场景通过new产⽣⼀个对象需要⾮常繁琐的数据准备或访问权限,则可以使⽤原型模式。

  • ⼀个对象多个修改者的场景 ⼀个对象需要提供给其他对象访问,⽽且各个调⽤者可能都需要修改其值时,可以考虑使⽤原型模式拷⻉多个对象供调⽤者使⽤。

扩展延伸

学习原型模式,必须要了解两个概念:浅拷贝,深拷贝。

浅拷贝 :只复制指向某个对象的指针,而不复制对象本身,相当于是新建了一个对象,该对象复制了原对象的指针,新旧对象还是共用一个内存块。

深拷贝:是新建一个一模一样的对象,该对象与原对象不共享内存,修改新对象也不会影响原对象。

在java中的浅拷贝与深拷贝:

image-1669084103228

结合这张图,你能理解代码片段的输出结果了吗?