設計模式 原型模式

2021-08-20 12:00:32 字數 2604 閱讀 3652

用原型例項制定建立物件的種類,並且通過拷貝這些原型建立新的物件。從乙個物件再建立乙個可定製的物件,而且不需知道任何建立的細節。

如果欄位是值型別的,則對該字段執行逐位複製,如果欄位是引用型別的,則複製引用但不複製引用的物件。形成原始物件與其複本引用同一物件。簡單來說,值型別變數,無論是淺複製還是深複製,其值會因原始物件的更改而更改。引用型別變數,若是淺複製,其轉殖物件的值會隨原始物件的變化而變化。若是深複製,其轉殖物件的值不會隨原始物件的變化而變化。

有乙個類。例項化複製後想保留這個例項的乙個備份。

例如 :

//clone類中包含乙個int length欄位。

clone clonetest=new clone();

clone clonecopy=newclone();

clonetest..length=0;

clonecopy=clonetest;

到這個部分

clonetest

和clonecopy

中的length

值都變為

0了。 但如果接著加一行**

clonetest.length=1;

預期是希望

clonetest

中length=1

而clonecopy

中length=0

;但實際兩者都變為1了。

這裡出現這個原因就是因為類是個引用型別,所以當執行

clonecopy=clonetest;

時,是將位址給過去了。於是當然一者變。兩者都會變了。

c#中的引用型別採用這種方法都是給位址。複製引用位址就是淺度複製。而複製物件的值,建立新的物件就是深度複製。

class workexperience//工作經歷類

set

}private string company;//公司

public string company

set }}

class resume : icloneable//簡歷類

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

public void setworkexperience(string workdate,string company)//呼叫此方法時,給物件的兩屬性複製

public void display()

", name, ***, age);

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

}public object clone()

}

客戶端**:

static void main(string args)

class workexperienct : icloneable//工作經歷實現icloneable介面

set

}private string company;

public string company

set

}//建立當前物件的淺表複製

//方法是建立乙個新的物件,將當前物件的字段資訊複製到該新物件

//如果該欄位型別為值型別,那麼對該字段執行逐位複製

//如果是引用型別,則複製引用但不複製引用物件

public object clone()//工作經歷類實現轉殖方法

}class resume : icloneable

private resume(workexperienct work)

//提供clone方法呼叫的私有建構函式,以便轉殖工作經歷的資料

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()

}

1.效能提高

2.逃避建構函式的約束

1.配備轉殖方法需要對類的功能進行通盤考慮,對於全新的類不是很難,當對於已有的類,應用不支援序列化的間接物件,或引用含有迴圈結構時,比較複雜

2.必須實現cloneable介面

1、資源優化場景。 

2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。 

3、通過 new 產生乙個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。 

4、乙個物件多個修改者的場景。

乙個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用。 

5、在實際專案中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法建立乙個物件,然後由工廠方法提供給呼叫者。

設計模式 原型模式

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

設計模式 原型模式

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

設計模式 原型模式

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