3.6 原型模式
模式定义:
原型模式:通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例,被复制的实例就是我们所称的“原型”。
UML类图:
类图代码:
浅拷贝:
public class Thing implements Cloneable{ //定义一个私有变量 private ArrayList<String> arrayList = new ArrayList<String>(); @Override public Thing clone(){ Thing thing=null; try { thing = (Thing)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } //设置HashMap的值 public void setValue(String value){ this.arrayList.add(value); } //取得arrayList的值 public ArrayList<String> getValue(){ return this.arrayList; } }
public class Client { public static void main(String[] args) { //产生一个对象 Thing thing = new Thing(); //设置一个值 thing.setValue("张三"); //拷贝一个对象 Thing cloneThing = thing.clone(); cloneThing.setValue("李四"); System.out.println(thing.getValue()); } }
Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。
深拷贝:
public class Thing implements Cloneable{ //定义一个私有变量 private ArrayList<String> arrayList = new ArrayList<String>(); @Override public Thing clone(){ Thing thing=null; try { thing = (Thing)super.clone(); thing.arrayList = (ArrayList<String>)this.arrayList.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } }
public class Client { public static void main(String[] args) { //产生一个对象 Thing thing = new Thing(); //设置一个值 thing.setValue("张三"); //拷贝一个对象 Thing cloneThing = thing.clone(); cloneThing.setValue("李四"); System.out.println(thing.getValue()); } }
使用场景:
(1)资源优化场景
类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
(2)性能和安全要求的场景
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
(3)一个对象多个修改者的场景
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。