原型模式從字面上來看, 可能還不是那麼通俗, 通俗點講, 可以說是拷貝模式.
從拷貝來說, 有完全拷貝, 和不完全拷貝. 就彷彿孫猴子的吹毛生猴, 但是這些小猴子明顯就沒有孫悟空本體厲害, 這種拷貝, 算是淺拷貝吧.
既然有淺拷貝, 那肯定也是有深拷貝的. 深拷貝就是小猴子與孫悟空本體一樣厲害, 無論是從本事還是從長相, 都是一樣的
一、原型
///原型上, 我放了乙個值型別, 乙個字串, 乙個整形集合, 在原型模式下, 我會修改這幾個值, 來觀察轉殖之後的變化///原型
///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 有些時候我們想要...