設計模式 原型模式

2021-09-20 15:36:17 字數 2613 閱讀 4375

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

即:就是從乙個物件再建立另外乙個可定製的物件,而且不需知道任何建立的細節。就是轉殖乙個新的物件,在客戶端,看不到簡歷類的內容。但是可以修改細節。

例項:寫簡歷。我們簡單設定個人資訊和工作經歷不同的兩個新情況。

簡歷類:

class resume:icloneable

//設定個人資訊

public void setpersonalinfo(string ***,string age)

//設定工作經歷

public void setworkexperience(string timearea,string company)

//顯示

public void display()

",name,***,age);

console.writeline("工作經歷: ",timearea,company);

}public object clone()

}

客戶端:

static void main(string args)

結果:

分析:只需要呼叫clone方法就可以實現新簡歷的生成,並且可以再修改新簡歷的細節。 一般在初始化的資訊不發生變化的情況下,轉殖是最好的辦法。這既隱藏了物件建立的細節,又對效能是大大的提高。轉殖不用重新初始化物件,而是動態地獲得物件執行時的狀態。

淺複製與深複製:

我認為淺複製就相當於對乙個東西的操作。深複製就是複製乙個新東西,對它進行操作。舉例:淺複製就是對於乙個種子,栽種澆水。深複製是轉殖出新的種子,對它進行栽種澆水各種操作,原來的種子不受影響。

簡歷淺複製的實現:

**:工作經歷類:

//工作經歷

class workexperience

set

}private string company;

public string company

set }}

簡歷:

//簡歷

class resume : icloneable

//設定個人資訊

public void setpersonalinfo(string ***, string age)

//設定工作經歷

public void setworkexperience(string workdate, string company)

//顯示

public void display()

", name, ***, age);

console.writeline("工作經歷: ", work.workdate, work.company);

}public object clone()

}

客戶端呼叫**:

分析:對於值型別name,***,age,當客戶端對其進行修改時,會發生改變。但是對於引用型別,如work.date,work.company只是複製了引用,並不是複製了實體,所以一直是對於原始物件進行修改。於是三次展示的都是最後修改的結果。

簡歷深複製的實現:

工作經歷類中,增加了轉殖這個方法。

public object clone()

簡歷類中提供clone方法呼叫的私有建構函式,以便轉殖「工作經歷」的資料。

private resume(workexperience work)

簡歷類呼叫私有的構造方法,讓「工作經歷」轉殖完成,然後再給這個「簡歷」物件的相關字段賦值,最終返回乙個深複製的簡歷物件。

public object clone()

結果,三次的顯示結構各不同:

分析:

這樣是分別轉殖出幾個實體,進行修改,所以三種呈現的不同的結果。

設計模式 原型模式

1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...

設計模式 原型模式

魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...

設計模式 原型模式

原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...