在軟體系統開發中,有時候會遇到這樣的情況:我們需要用到多個相同例項,最簡單直接的方法是通過多次呼叫new方法來建立相同的例項。如下:
person person=new person();但是有乙個問題,如果我用要使用的例項建立起來十分耗費資源,或者建立起來步驟比較繁瑣,上邊的**缺點就暴露出來了:耗費資源,每次建立例項都要重複繁瑣的建立過程。原始模式可以很好地解決這個問題,使用原型模式我們不需要每次都new乙個新的例項,而是通過拷貝原有的物件來完成建立,這樣我們就不需要在記憶體中建立多個物件,也不需要重複複雜的建立過程了。下邊以複製人為例解釋原型模式的用法,**非常簡單。person person2=new person();
person person3=new person();
人類原型類,提供了乙個轉殖抽象方法:
///人類繼承原型類,表示人類可以被轉殖,每個人都有名字,年齡和住址:///人類原型抽象類
/// public
abstract
class
personprototype
///客戶端**:///person
/// public
class
person: personprototype
public
int age
public address address
public
override
object
clone()
}//////
住址
/// public
class
address
public
string city
}
static執行結果如下:void main(string
args)
};//乙個複製人,通過clone方法替代了new方法
person cloneperson =(person)person1.clone();
console.writeline($
"person1的name:,年齡:,
" +$
"省份:,城市:");
console.writeline($
"複製人的name:,年齡:,
" +$
"省份:,城市:");
console.readkey();
}
我們可以看到,通過clone方法成功獲取了乙個相同的person例項。
這裡需要注意一點:通過object.memberwiseclone()獲取乙個物件的例項屬於淺拷貝,對例項的簡單型別屬性進行全值拷貝(包含string型別),對複雜型別屬性只拷貝了引用。客戶端**如下
static執行結果:對於複雜型別address,修改cloneperson的省份和城市,person1的address也修改了。而修改cloneperson的名字,person1的名字沒有變。void main(string
args)
};//乙個複製人
person cloneperson =(person)person1.clone();
cloneperson.name = "
tom"
; cloneperson.age = 22
; cloneperson.address.province = "浙江"
; cloneperson.address.city = "杭州"
; console.writeline($
"person1的name:,年齡:,
" +$
"省份:,城市:");
console.writeline($
"複製人的name:,年齡:,
" +$
"省份:,城市:");
console.readkey();}}
修改cloneperson的名字,person1的名字沒有變,這一點是memberwishclone方法和直接賦值的區別,我們修改客戶端**,將
static執行結果:直接賦值修改字串型別的屬性(name)原始例項也會修改void main(string
args)
};//這裡使用直接賦值,而不是clone
person cloneperson =person1;
cloneperson.name = "
tom"
; cloneperson.age = 22
; cloneperson.address.province = "浙江"
; cloneperson.address.city = "杭州"
; console.writeline($
"person1的name:,年齡:,
" +$
"省份:,城市:");
console.writeline($
"複製人的name:,年齡:,
" +$
"省份:,城市:");
console.readkey();
}
上邊例子的類圖
原型模式的優點:
1.隱藏了建立例項的繁瑣過程,只需通過clone方法就可以獲取例項物件
2.使用淺拷貝替代new,減少資源消耗
原型模式的缺點:
1.需要新增乙個clone方法,c#中一般使用memberwishclone方法來獲取例項的淺拷貝副本。
補充:如果想實現深拷貝常用的有兩種方法:①將原始例項序列化,然後反序列化賦值給副本物件;②淺拷貝+遞迴的方式,類似於遍歷資料夾,對所有的複雜屬性、複雜屬性內部的複雜屬性都進行淺拷貝。
設計模式 6 原型模式
有時需要生成多個相同的物件,最普通的方法就是就是用相同的屬性new相同的物件 public class main class chicken 這樣做的缺點是,如果需要修改乙個屬性,其他物件的屬性就要跟著改一遍,有乙個便捷的方法,就是採用 原型模式,從乙個物件再建立另外乙個可定製的物件,不需要知道任何...
設計模式 6 原型模式
1996年7月5日,英國科學家伊恩 威爾穆特博士成功的轉殖出了乙隻小羊,小羊與它的 母親 一模一樣。這只小羊的名字就是dolly。dolly是由 不要認為介紹多莉轉殖的故事和本文牛頭不對馬嘴,事實上多少還是有點關係的。1.什麼是原型模式?原型模式就是用來建立重複的物件,再直白一點 複製貼上的原理。怎...
C 設計模式 原型模式
定義 用原型 prototype 例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。結構 理解 1.prototype 是原型基類,提供clone 純虛方法,它根據不同的派生類來轉殖不同的物件。2.concreteprototype 是原型具體類。實現clone 方法,轉殖自己,返回轉殖後的...