原型设计模式
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(); } }

浙公网安备 33010602011771号