设计模式(五)原型模式

125 阅读1分钟

1.介绍

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象,是一种创建型设计模式,允许对象再创建另外一个可定制的对象,无需知道如何创建的细节。

image.png

传统的方式复制一个对象

public class Sheep{
    private String name;
    private int age;
    private String color
    set()...
    get()..
}

public class Client{
    main(){
        Sheep sheep = new Sheep("tom",1,"白色")
        Sheep sheep1 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor())
        Sheep sheep2 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor())
    }
}

缺点:

(1)在创建对象时,需要重新获取对象的属性值,如果创建的对象比较复杂,效率低

(2)需要初始化对象,而不是动态地获得对象运行时的状态,不够灵活

克隆模式

public class Sheep implements{
    private String name;
    private int age;
    private String color
    set()...
    get()..
    
    // 使用默认方法
    protected Obeject clone() throws CloneNotSupportedException{
        Sheep sheep = null;
        sheep = (Sheep)super.clone();
        return sheep;
    }
}

public class Client{
    main(){
        Sheep sheep = new Sheep("tom",1,"白色")
        Sheep sheep1 = (Sheep)sheep.clone();
    }
}

2.深拷贝和浅拷贝

(1)浅拷贝

对于数据类型是基本数据类型的成员变量,浅拷贝会直接会直接进行值的传递,如果是引用类型的成员变量,会进行引用传递,在这种情况下,如果一个对象的成员变量改变,会影响到另一个对象,在java中,浅拷贝使用默认的clone()实现的

(2)深拷贝

复制对象的所有基本数据类型,为引用数据类型开辟新的内存空间。再java中,重写clone方法或者使用序列化方法实现深拷贝

3.js中的克隆模式

Object.create使用了原型模式的思想,基于原型创建一个对象

const prototype = {
    getName:function(){
      return '111'
    }
}
const x = Object.create(prototype)