找工作之前制作简历时,需要做很多份简历,而且简历的格式是一样的,也就意味着要做很多重复性的工作。在编程过程中,遇到重复性工作多的时候,粘贴复制是最快的解决办法。但是一旦这些代码需要修改时,那么每一处用到这段代码的地方都需要进行修改,这也就增加了代码维护工作。在学习VB的时候,我们总是把相同的代码放在模块中,然后用到这段代码的地方就调用模块,这样的话耦合性又是比较大的。那么,解决这个问题到底该怎么办呢?
设计模式中的原型模式就很好的解决了这个问题。原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建的对象。
也就是说,先生成一份模板,然后其余的对象都去拷贝这份模板,那么得到的对象就都是一样的了。
下面小编就以简历复制为例子,简单介绍原型模式:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">//工作经历类 class WorkExperience { public String workDate; public String company; } //简历类 class Resume implements Cloneable{ private String name; private String sex; private String age; private WorkExperience work; public Resume(String name){ this.name=name; work=new WorkExperience; } //设置个人信息 public void SetPersonalInfo(String sex,String age){ this.sex=sex; this.age=age; } //设置工作经历 public void SetWorkExperience(String workDate,String company){ work.workDate=workDate; work.company=company; } public Object Clone(){ return this.Clone(); } } //客户端 class WorkResume{ public static void main(String[] args){ Resume a =new Resume("张三"); a.SetPersonalInfo("男","20"); a.SetWorkExperience("1998~2000","XX公司"); Resume b=(Resume)a.Clone(); b.SetWorkExperience("2000~2006","YY公司"); } }</span></span>这样设置完成之后得到的结果却是两条信息是一样的,而且工作经历都是最新的这一条。
做代码的内存分析,可得到如下图:
即a、b两个对象指向的是同一块内存,也就是说b在进行修改时,a的信息也会被修改,这也就是原型模式的浅复制。浅复制的意思就是说,只把对象a的引用复制给b,二者指向同一区域,当一个修改时,会影响另一个对象。
对代码进行修改,将工作经历类改为:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">//工作经历类 class WorkExperience implements Cloneable{ private String workDate; private String company; public Object Clone(){ WorkExperience obj=new WorkExperience(); obj.workDate=this.workDate; obj.company=this.company; return obj; } }</span></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"> public Object Clone(){ Resume obj=new Resume(this.work); obj.name=this.name; obj.sex=this.sex; obj.age=this.age; return obj; }</span></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"> private Resume(WorkExperience work){ this.work=(WorkExperience)work.Clone(); } </span></span>则得到的结果就是我们想要的结果了。
到此为止,原型模式的深浅复制就介绍完了,如果有什么理解不到位的地方,欢迎广大读者给出指导。
总结
深浅复制其实不难,只要把内存分析搞懂了就好了。浅复制是把一个对象的引用复制给另一个对象,二者对同一块内存区域进行操作,类似于参数传递中的传址。而深复制则是把原型对象的内存区域也复制一份给拷贝对象,二者各自拥有自己的引用,各自操作自己的内存区域,互不影响,类似于参数传递中的传值。