找工作之前制作简历时,需要做很多份简历,而且简历的格式是一样的,也就意味着要做很多重复性的工作。在编程过程中,遇到重复性工作多的时候,粘贴复制是最快的解决办法。但是一旦这些代码需要修改时,那么每一处用到这段代码的地方都需要进行修改,这也就增加了代码维护工作。在学习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>
将简历类中的Clone方法改为:
<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>
则得到的结果就是我们想要的结果了。
对新代码进行内存分析,如下图:
到此为止,原型模式的深浅复制就介绍完了,如果有什么理解不到位的地方,欢迎广大读者给出指导。
总结
深浅复制其实不难,只要把内存分析搞懂了就好了。浅复制是把一个对象的引用复制给另一个对象,二者对同一块内存区域进行操作,类似于参数传递中的传址。而深复制则是把原型对象的内存区域也复制一份给拷贝对象,二者各自拥有自己的引用,各自操作自己的内存区域,互不影响,类似于参数传递中的传值。