在程序设计中,经常会遇见,首先创建出来一个实例,但是基于各种原因,可能会创建一个相同的实例,在新创建的实例中做相关的功能,此时就需要作出拷贝,原始方法是使用new,然后在进行赋值。
举例:
在游戏开发中,武将Hero 是在玩家身上,界面中需要展示出他的属性,比如血量,能量值之类的东西;
玩家对打的时候,会满血进入战斗,战斗中会有血量的消耗, 能量值的变动,如果只直接使用玩家身上的hero,不做其他操作直接进入战斗,由于java是引用传递(基本数据类型+String是按值传递),战斗中血量的减少势必会影响玩家展示界面的血量展示,就必须重新new一个相同的hero进行战斗。如果在每个战斗开始处都使用new去创建界面,代码会显得很复杂,而且难以控制,也不灵活。此时原型模式就起作用了,他的原理就是对象的克隆,在对象内部创建一个clone()的方法,然后需要赋值的时候直接是A a = A.clone();将已有的对象赋值一份,满足需要的结果。
public class Hero { String hid; String pid; String hName; int hLv; public Hero clone() { Hero h = new Hero(); h.setHid(hid); h.sethLv(hLv); h.setPid(pid); return h; } public String getHid() { return hid; } public void setHid(String hid) { this.hid = hid; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } }
需要创建相同的复制实例的时候:
public class ProtoTypeTest { public static void main(String[] args) { Hero h = new Hero(); //需要创建一样的hero Hero newHero = h.clone(); } }
在java设计语言中,接口Cloneable 也可以作为对象的克隆使用,但是其中需要考虑clone是浅拷贝还是深拷贝;
浅拷贝:拷贝基础字段和string值,比如int,boolean,double,string 之类;
深拷贝:是在浅拷贝的基础上,递归拷贝对象中涉及的引用部分;