如何理解原型模式中的深复制和浅复制

    找工作之前制作简历时,需要做很多份简历,而且简历的格式是一样的,也就意味着要做很多重复性的工作。在编程过程中,遇到重复性工作多的时候,粘贴复制是最快的解决办法。但是一旦这些代码需要修改时,那么每一处用到这段代码的地方都需要进行修改,这也就增加了代码维护工作。在学习VB的时候,我们总是把相同的代码放在模块中,然后用到这段代码的地方就调用模块,这样的话耦合性又是比较大的。那么,解决这个问题到底该怎么办呢?


    设计模式中的原型模式就很好的解决了这个问题。原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建的对象。

                         如何理解原型模式中的深复制和浅复制_第1张图片

    也就是说,先生成一份模板,然后其余的对象都去拷贝这份模板,那么得到的对象就都是一样的了。


    下面小编就以简历复制为例子,简单介绍原型模式:

<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>
    这样设置完成之后得到的结果却是两条信息是一样的,而且工作经历都是最新的这一条。


    做代码的内存分析,可得到如下图:

                              如何理解原型模式中的深复制和浅复制_第2张图片

    即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>
则得到的结果就是我们想要的结果了。


    对新代码进行内存分析,如下图:
                         如何理解原型模式中的深复制和浅复制_第3张图片

    到此为止,原型模式的深浅复制就介绍完了,如果有什么理解不到位的地方,欢迎广大读者给出指导。


总结


    深浅复制其实不难,只要把内存分析搞懂了就好了。浅复制是把一个对象的引用复制给另一个对象,二者对同一块内存区域进行操作,类似于参数传递中的传址。而深复制则是把原型对象的内存区域也复制一份给拷贝对象,二者各自拥有自己的引用,各自操作自己的内存区域,互不影响,类似于参数传递中的传值。

你可能感兴趣的:(设计模式)