C 設計模式(6) 原型模式

2022-01-15 03:08:28 字數 3194 閱讀 4571

在軟體系統開發中,有時候會遇到這樣的情況:我們需要用到多個相同例項,最簡單直接的方法是通過多次呼叫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方法來獲取例項的淺拷貝副本。

補充:如果想實現深拷貝常用的有兩種方法:①將原始例項序列化,然後反序列化賦值給副本物件;②淺拷貝+遞迴的方式,類似於遍歷資料夾,對所有的複雜屬性、複雜屬性內部的複雜屬性都進行淺拷貝。

設計模式 6 原型模式

有時需要生成多個相同的物件,最普通的方法就是就是用相同的屬性new相同的物件 public class main class chicken 這樣做的缺點是,如果需要修改乙個屬性,其他物件的屬性就要跟著改一遍,有乙個便捷的方法,就是採用 原型模式,從乙個物件再建立另外乙個可定製的物件,不需要知道任何...

設計模式 6 原型模式

1996年7月5日,英國科學家伊恩 威爾穆特博士成功的轉殖出了乙隻小羊,小羊與它的 母親 一模一樣。這只小羊的名字就是dolly。dolly是由 不要認為介紹多莉轉殖的故事和本文牛頭不對馬嘴,事實上多少還是有點關係的。1.什麼是原型模式?原型模式就是用來建立重複的物件,再直白一點 複製貼上的原理。怎...

C 設計模式 原型模式

定義 用原型 prototype 例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。結構 理解 1.prototype 是原型基類,提供clone 純虛方法,它根據不同的派生類來轉殖不同的物件。2.concreteprototype 是原型具體類。實現clone 方法,轉殖自己,返回轉殖後的...