C 設計模式 原型模式

2022-04-12 05:02:08 字數 2896 閱讀 5692

在軟體系統開發中,有時候會遇到這樣的情況:我們需要用到多個相同例項,最簡單直接的方法是通過多次呼叫new方法來建立相同的例項。如下:

person person=new person();

person person2=new person();

person person3=new person();

但是有乙個問題,如果我用要使用的例項建立起來十分耗費資源,或者建立起來步驟比較繁瑣,上邊的**缺點就暴露出來了:耗費資源,每次建立例項都要重複繁瑣的建立過程。原始模式可以很好地解決這個問題,使用原型模式我們不需要每次都new乙個新的例項,而是通過拷貝原有的物件來完成建立,這樣我們就不需要在記憶體中建立多個物件,也不需要重複複雜的建立過程了。下邊以複製人為例解釋原型模式的用法,**非常簡單。

人類原型類,提供了乙個轉殖抽象方法:

/// /// 人類原型抽象類

///

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)

};//乙個複製人

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

執行結果:對於複雜型別address,修改cloneperson的省份和城市,person1的address也修改了。而修改cloneperson的名字,person1的名字沒有變。

修改cloneperson的名字,person1的名字沒有變,這一點是memberwishclone方法和直接賦值的區別,我們修改客戶端**,將

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

}

執行結果:直接賦值修改字串型別的屬性(name)原始例項也會修改

上邊例子的類圖

原型模式的優點:

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種,一種是淺度複製,另一種是深度複製。建立型模式一般是用來建立乙個新的物件,然後我們使用這個物件完成一些物件的操作,我們通過原型模式可以快速...