問題引入:誇張的簡歷。
簡歷類:
class
resume
public
void
setpersonalinfo
(string ***,
int age)
public
void
setworkexperience
(string timearea,string company)
public
void
display()
}
客戶端:
public
class
main
}
如**所示,沒寫乙份簡歷都要新例項化乙個物件,實現起來非常麻煩,不現實
對此情景而言,可以先例項化乙份簡歷作為原型,其他的簡歷可以通過複製第乙份簡歷而實現,避免了每寫乙份簡歷就例項化一次的複雜操作。原型模式其實就是從乙個物件再建立另乙個可定製的物件,而且不需要知道任何建立的細節。
改進1:
改變:實現了複製的介面類,增加了複製方法
簡歷類:
class
resume
implements
cloneable
//實現了介面類
public
void
setpersonalinfo
(string ***,
int age)
public
void
setworkexperience
(string timearea,string company)
public
void
display()
public resume clone()
throws clonenotsupportedexception
}
客戶端:
public
class
main
}
改進2:將簡歷類裡面的work單獨另寫乙個workexperience類
工作經歷類:
class
workexperience
public
void
setworkdate
(string workdate)
public string getcompany()
public
void
setcompany
(string company)
}
簡歷類:
class
resume
implements
cloneable
public
void
setwork
(string workdate,string company)
public
void
display()
public resume clone()
throws clonenotsupportedexception
}
客戶端類似上面
顯示:
出現了問題,控制台上顯示的都是最後一次設定的值。該問題是因為淺複製引起的。
在"改進2"裡,將工作經歷單獨寫了乙個類,是簡歷類的乙個字段,而淺複製是:如果欄位是值型別的,則對該字段逐位複製,如果是引用型別,則複製引用,但不複製引用的物件。在該例中resume中的name、***和age都是值型別的,所以當進行 」resume b=a.clone()」時 ,被複製的新物件b的變數name、***和age都與原來的物件a有相同的值,而新物件b的work只是複製了原來的物件的引用,其指向的仍然是原來的物件a的值
改進3:
讓workexeprience類也實現cloneable介面,實現深複製
工作經歷類:
class
workexperience
implements
cloneable
public
void
setworkdate
(string workdate)
public string getcompany()
public
void
setcompany
(string company)
public workexperience clone()
catch
(clonenotsupportedexception e)
return null;
}}
簡歷類:(隨之做相應改變)
class
resume
implements
cloneable
public
void
setwork
(string workdate,string company)
public
void
display()
public resume clone()
}
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...