設計模式——原型模式(Prototype Pattern)

在看《大話設計模式》
看到深拷貝和淺拷貝有點不太懂。


如果有引用,

  • 淺拷貝:原對象和副本引用同一對象。對屬性直接拷貝。是引用類型的話,只複製引用,不復制引用的對象。
  • 深拷貝:原對象和副本引用的不是同一個對象。

淺拷貝:

class WorkExperience{
	String workDate;
	String company;
	public WorkExperience() {
	}
	public void SetworkDate(String a) {
		this.workDate=a;
	}
	public String getWorkDate() {
		return workDate;
	}

	public void SetCompany(String a) {
		this.company=a;
	}
	public String getCompany() {
		return 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 SetPerInfo(String sex,String age) {
		this.sex=sex;
		this.age=age;
	}
	public void SetWorkExperience(String date,String comp) {
		work.company=comp;
		work.workDate=date;
	}
	public void Show() {
		System.out.println(name+","+sex+','+age);
		System.out.println(work.workDate+','+work.company);
	}
	 protected Object clone() {
		Object obj=null;
		try {
			obj= super.clone();
			
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (Resume)obj;
	}
}
public class PrototypeDemo {
	public static void main(String args[]) {
		Resume st=new Resume("老蔡");
		st.SetPerInfo("man", "10");
		st.SetWorkExperience("1990-1995", "BAt");
		st.Show();
		
		
		Resume st1=(Resume)st.clone();
		st1.SetPerInfo("man","30");
		st1.SetWorkExperience("1999-2000", "IBM");
		st1.Show();
		st.Show();
	}
}

看這裏,st1st的副本,st裏面有個WorkExperience引用,所以st1引用了同一個對象。
就結果而言,st1裏這個對象改變了,st也要改變。

st1.Show();
st.Show();

輸出不同。


深拷貝:

class WorkExperience implements Cloneable{
	String workDate;
	String company;
	public void SetworkDate(String a) {
		this.workDate=a;
	}
	public String getWorkDate() {
		return workDate;
	}

	public void SetCompany(String a) {
		this.company=a;
	}
	public String getCompany() {
		return company;
	}
	
	public Object Clone() {
		Object obj=null;
		try {
			obj=super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (Object)obj;
	}
}
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 Resume(WorkExperience a) {
		this.work=a;
	}
	public void SetPerInfo(String sex,String age) {
		this.sex=sex;
		this.age=age;
	}
	public void SetWorkExperience(String date,String comp) {
		work.company=comp;
		work.workDate=date;
	}
	public void Show() {
		System.out.println(name+","+sex+','+age);
		System.out.println(work.workDate+','+work.company);
	}
	 protected Object clone() {
		Resume obj = null;
		try {
			obj = (Resume) super.clone();
			obj.work=(WorkExperience) obj.work.Clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return obj;
	}
}
public class PrototypeDeepDemo {
	public static void main(String args[]) {
		Resume st=new Resume("老蔡");
		st.SetPerInfo("man", "10");
		st.SetWorkExperience("1990-1995", "BAt");
		st.Show();
		
		
		Resume st1=(Resume)st.clone();
		st1.SetPerInfo("man","30");
		st1.SetWorkExperience("1999-2000", "IBM");
		st1.Show();
		
		st.Show();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章