設計模式 原型模式

2022-02-13 13:14:53 字數 3122 閱讀 8555

原型模式從字面上來看, 可能還不是那麼通俗, 通俗點講, 可以說是拷貝模式.

從拷貝來說, 有完全拷貝, 和不完全拷貝. 就彷彿孫猴子的吹毛生猴, 但是這些小猴子明顯就沒有孫悟空本體厲害, 這種拷貝, 算是淺拷貝吧. 

既然有淺拷貝, 那肯定也是有深拷貝的. 深拷貝就是小猴子與孫悟空本體一樣厲害, 無論是從本事還是從長相, 都是一樣的

一、原型

///

///原型

///abstract

public

class

prototype

public

string name

public list size = new list();

public prototype(int

id)abstract

public

prototype clone();

}

原型上, 我放了乙個值型別, 乙個字串, 乙個整形集合, 在原型模式下, 我會修改這幾個值, 來觀察轉殖之後的變化

二、淺拷貝

public

class

concrete1 : prototype

public

override

prototype clone()

}

測試**:

console.writeline("

--------------淺拷貝----------------------");

concrete1 p1 = new concrete1(1

);p1.name = "

name";

p1.size.addrange(

newint );

concrete1 c1 =(concrete1)p1.clone();

console.writeline(

"before concrete1 change");

console.writeline(

"cloned : id - , name - , size -

", c1.id, c1.name, string.join(","

, c1.size));

console.writeline();

p1.id = 2

;p1.name = "

p1.name";

p1.size.addrange(

newint );

console.writeline(

"after concrete1 changed");

console.writeline(

"cloned : id - , name - , size -

", c1.id, c1.name, string.join("

,", c1.size));

結果:

可以看到, 我在轉殖之後, 修改了原型集合的值,  轉殖物件也跟著改變了, 說明他們的集合變數指向同一塊堆空間. 

console.writeline("

p1.size == c1.size,

", p1.size == c1.size);

有圖有真相.

三、深拷貝

public

class

concrete2 : prototype

public

override

prototype clone()

}

測試**:

console.writeline("

--------------深拷貝----------------------");

concrete2 p2 = new concrete2(2

);p2.name = "

name";

p2.size.addrange(

newint );

concrete2 c2 =(concrete2)p2.clone();

console.writeline(

"before concrete2 change");

console.writeline(

"cloned : id - , name - , size -

", c2.id, c2.name, string.join(","

, c2.size));

console.writeline();

p2.id = 2

;p2.name = "

p2.name";

p2.size.addrange(

newint );

console.writeline(

"after concrete2 changed");

console.writeline(

"cloned : id - , name - , size -

", c2.id, c2.name, string.join(","

, c2.size));

console.writeline(

"p2.size == c2.size,

", p2.size == c2.size);

結果:可以看到, 拷貝實體並沒有任何變化, 說明他們已經是兩個獨立的分開的實體. 並沒有共同的變數引用(方法引用除外).

在這裡, 我實現深拷貝的方式是通過序列化的方式, 當然還有很多別的方式. 可以自己實現. c#提供的那個轉殖方法, 是淺拷貝的實現.

c#有乙個介面:icloneable, 如果不想做成抽象類, 也可以通過這個介面去實現.

四、個人應用

就我個人在專案中的應用來看, 最近使用過結構轉殖.

datatble這個變數, 無論是b/s, 還是c/s, 應該都是用過的吧.

它有乙個clone方法, 可以用來轉殖表結構和約束, 相當方便, 我不需要再去做一遍繁雜的表結構建立.

參考:大話設計模式

c#設計模式(9)

設計模式 原型模式

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

設計模式 原型模式

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

設計模式 原型模式

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