原型设计模式

1)作用:用原型实例指定创建对象的种类,并且通过复制(克隆)这些原型创建的对象。

2)关键点:

  1.protoType(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。

  2.ConcreatePrototype(具体原型类):它实现在抽象原型类的中声明的抽象方法,在克隆方法中返回自己的一个克隆对象。

  3.Client(客户类):让一个原型对象克隆自身从而创建一个全新对象。    

3)使用场景:构造函数非常复杂,通过new产生一个对象需要非常繁琐的数据准备。

4)实现:深浅克隆:主要区别在于是否支持引用类型的成员变量的复制。

    1.浅克隆/拷贝:对值类型的成员变量进行值得复制,对引用类型的成员变量只复制引用,不复制引用的对象。

           浅克隆:只重写父类的clone方法。

    2.深克隆:对值类型的变量进行值得复制,对引用类型得变量也进行引用对象得复制。

           深克隆:在深克隆中,除了对象本身复制外,对象所包含的所有成员变量也将复制。

5)注意事项:1.在java虚拟机中,实现(Cloneable)接口,并继承clone方法,否则在运行时会抛出CloneNotSupportedException异常。

      2.对象拷贝时,构造函数没有被执行,Object类得clone方法得原理是从堆内存中以二进制流的形式进行拷贝,重新分配一个内存块。

6)原型模式分析:

  1.优点:原型模型性能比直接new一个对象高;避免构造函数得约束。  

package com.ual.protoType;

import java.util.Arrays;

public class Resume1 implements Cloneable{
    private  String name;
    private int age;
    private String[] hobby;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Resume1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume1 rs = (Resume1)super.clone();
        rs.hobby=rs.getHobby().clone();//对引用类型,再进行克隆
        return rs;
    }
}
package com.ual.protoType;

public class Test {
    @org.junit.Test
    public void test() throws CloneNotSupportedException {
        Resume1 rs1=new Resume1();
        Resume1 rs2 =(Resume1)rs1.clone();
    }
}

 

posted @ 2019-04-02 00:24  Uarealoser  阅读(426)  评论(0)    收藏  举报