在軟體系統開發中,有時候會遇到這樣的情況:我們需要用到多個相同例項,最簡單直接的方法是通過多次呼叫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 void main(string args)執行結果:對於複雜型別address,修改cloneperson的省份和城市,person1的address也修改了。而修改cloneperson的名字,person1的名字沒有變。};//乙個複製人
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 void main(string args)執行結果:直接賦值修改字串型別的屬性(name)原始例項也會修改};//這裡使用直接賦值,而不是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方法來獲取例項的淺拷貝副本。
補充:如果想實現深拷貝常用的有兩種方法:①將原始例項序列化,然後反序列化賦值給副本物件;②淺拷貝+遞迴的方式,類似於遍歷資料夾,對所有的複雜屬性、複雜屬性內部的複雜屬性都進行淺拷貝。
C 設計模式 原型模式
定義 用原型 prototype 例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。結構 理解 1.prototype 是原型基類,提供clone 純虛方法,它根據不同的派生類來轉殖不同的物件。2.concreteprototype 是原型具體類。實現clone 方法,轉殖自己,返回轉殖後的...
c 設計模式(原型模式)
good 從乙個物件再建立另外乙個可定製的物件,而無需知道任何建立的細節。並能提高建立的效能。說白了就copy技術,把乙個物件完整的copy出乙份。例 include include include using namespace std class prototype 抽象基類 prototype...
C 設計模式 原型模式
用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。建立型模式中乙個比較特殊的模式 原型模式,有個最大的特點是轉殖乙個現有的物件,這個轉殖的結果有2種,一種是淺度複製,另一種是深度複製。建立型模式一般是用來建立乙個新的物件,然後我們使用這個物件完成一些物件的操作,我們通過原型模式可以快速...