設計模式 原型模式

2021-06-21 21:35:29 字數 2953 閱讀 1223

魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。

像這種複製我們並不陌生,

類似於我們設計中的原型模式

。本文將從以下幾點**原型模式:

概述 

結構圖

淺複製
深複製

總結

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節。

複製過程,

並不是做乙個抽象類,去例項化它。而是只需通過實現乙個含有

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 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式 也就是平時說的轉殖 其實就是從乙個物件再建立另乙個可定製的物件,而且不需要知道任何建立的細節。這個模式估計是最簡單的了,其實就是在講深複製和淺複製,而且很多語言直接就已經支援深複製了。這個模式應用...