魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。
像這種複製我們並不陌生,
類似於我們設計中的原型模式
。本文將從以下幾點**原型模式:
概述
結構圖
淺複製
深複製
總結
用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。複製過程,允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節。
並不是做乙個抽象類,去例項化它。而是只需通過實現乙個含有
clone
()方法的介面就可以去轉殖,這就是
.net
在system
命名空間中提供的
icloneable介面。
但,僅僅了解到這裡是不夠的。複製還有淺複製和深複製。掌握了它
才能更好的運用複製模式。
淺複製:被複製物件的所有變數都含有與原來的物件相同的值。而所有的其他物件的引用都仍指向原來的物件。
結構圖
淺複製圖示// 此為 工作經歷 類
classworkexperience
set
}private string company;
public string company
set
} }
//簡歷類 其中會引用「工作經歷」物件
class resume:icloneable //實現介面icloneable ,該介面的方法就是clone
//設定個人資訊
public void setpersonalinfo(string ***,string age)
//設定個人工作經歷 呼叫此方法時,是給「工作經歷」的兩個屬性賦值
public voidsetworkexperience(string workdate,string company)
//顯示
public void display()
",name ,***,age);
console.writeline("工作經歷:",work .workdate ,work.company );
}public object clone()
} //客戶端呼叫**
static void main(string args)
如圖,簡歷複製之後,它的「引用工作經歷」處,仍需要引用。也就是說,淺複製並沒有複製
所引用的物件。也就是說,不管簡歷被複製多少分,工作經歷類
只有乙個,因此也就可以解釋,為什麼**中給
abc三處工作經歷設定,但卻同時看到三個引用都是最好一次設定。
因為三個引用,本來就是對乙個物件的操作。
那我們看深複製是怎樣的呢?
深複製:把引用物件的變數指向複製過的新物件,而不是原有的被引用的物件。
**結構圖
}//簡歷
class resume:icloneable
//提供clone方法呼叫的私有建構函式,以便轉殖「工作經歷」的資料
private resume(workexperience work)
//設定個人資訊
public void setpersonalinfo(string ***,string age)
//設定個人工作經歷
public voidsetworkexperience(string workdate,string company)
//顯示
public void display()
",name ,***,age);
console.writeline("工作經歷:",work .workdate ,work.company );
}/*簡歷轉殖,呼叫私有的構造方法,讓「工作經歷」轉殖完成,然後再給這個「簡歷」物件相關字段賦值,最終返回乙個深複製的簡歷物件*/
public object clone()
}深複製圖示
第一步,深複製讓工作經歷也實現轉殖介面。複製工作經歷。
第二步,把複製後的工作經歷放到
簡歷中。
第三步,此時將簡歷複製,並給這個簡歷物件的相關字段賦值,最終即返回乙個深複製的簡歷物件。
我們從中
可以看出,此時再第三步中,我們重新設定工作經歷,也只會影響當前的乙個。而不會影響到工作經歷的原型。
因此,當我們需要一變二
二變三時,就要用到深複製。
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...
設計模式 原型模式
原型模式 prototype 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式 也就是平時說的轉殖 其實就是從乙個物件再建立另乙個可定製的物件,而且不需要知道任何建立的細節。這個模式估計是最簡單的了,其實就是在講深複製和淺複製,而且很多語言直接就已經支援深複製了。這個模式應用...