小看 原型模式

2022-01-23 11:58:13 字數 4014 閱讀 7416

前面我們說過了單例模式,是用來強制保證同乙個程序內只有乙個物件;享元模式:利用第三方工廠來建立物件,也可以保證乙個程序內只有乙個物件(非強制保證);那麼今天我們來講講原型模式;先不說概念了,直接看下面乙個例子;

下面是乙個studentsingleton,裡面是可以保證乙個程序內只有乙個物件了的(簡單的保證)

public

class

studentsingleton

console.writeline($

"被構造");

}//////

單例

/// private

static studentsingleton _studentsingleton=new

studentsingleton();

public

static

studentsingleton createinstance()

}

下面我們在兩個地方要用到這個studentsingleton的物件;

var studentsingletone1 =studentsingleton.createinstance();

studentsingletone1.name = "

zhangzhen";

studentsingletone1.id = "

111"

; console.writeline(

"第乙個物件的name

"+studentsingletone1.name);

console.writeline(

"第乙個物件的id

" +studentsingletone1.id);

var studentsingletone2 =studentsingleton.createinstance();

studentsingletone2.name = "

1zhangzhen1";

studentsingletone2.id = "

222"

; console.writeline(

"第二個物件的name

" +studentsingletone2.name);

console.writeline(

"第二個物件的id

" +studentsingletone2.id);

console.writeline(

"----------------");

console.writeline(

"第乙個物件的name

" +studentsingletone1.name);

console.writeline(

"第乙個物件的id

" + studentsingletone1.id);

第二個物件的值改變和會影響第乙個(這個也是單例模式的缺點),於是我們就提出,有沒有這樣一種方法,能夠保證大家一起修改,不會互相影響呢?----------接下來解決這個問題就是原型模式,原型模式是為了解決同乙個程序如何保證只被構造一次,然後還可以做到互不影響(物件重用);

那接下來就來解決我們剛剛說的那個問題,上面的單例模式,雖然做到了同乙個程序只有乙個物件,但是物件操作相互影響。

原型模式:1、保證物件同乙個程序內,只被構造一次。2、還要做到物件操作相互不影響。

解決思路就是在單例模式的基礎,既然要做到物件操作相互不影響,那麼就每次建立物件返回的時候,返回乙份拷貝。

public

class

studentprototype

public

string name

private

studentprototype()

console.writeline($

"被構造");

}//////

單例

/// private

static studentprototype _studentprototype =new

studentprototype();

public

static

studentprototype createinstance()

}

上面這個例子,我們做了乙份記憶體拷貝之後,就成功的實現了物件只被構造一次,操作之間互不影響。

繼續剛剛的例子,我們給studentprototype加上一屬性叫做班級(class);

public

class

studentprototype

public

string name

public class class

private

studentprototype()

console.writeline($

"被構造");

}//////

單例

又發現對於引用型別呢,我們之前做法是失效的,這是為啥呢,因為我們上面的memberwiseclone()方法是可以實現淺拷貝,就是只是複製了物件的引用(沒有複製到具體的值)。大概過程如下

這個就是淺拷貝,淺拷貝拷貝的是物件的引用(沒有把整個物件一起拷貝過來);淺拷貝只是複製物件本身(就是該物件所在堆中的一塊連續位址內容)

深拷貝就是把整個物件都一起拷貝過來。

對於c#來說,值型別的複製就是全盤複製(string),引用型別的複製,淺拷貝是只複製引用。

對我們來說,如何實現對引用型別的全盤複製才是最主要的。如何實現深拷貝。

---接著我們的案例,我們暫時不說如何深拷貝先,我們先講一些其他做法先。

竟然是因為引用型別只是複製引用,那我們每次拷貝的是去改變它的引用不就可以做到了互不影響嗎,基於這個思路,我們**做如下改變;

這樣子也能夠實現了我們的對引用型別的拷貝。

但是就像很多人說的那樣,這種做法不太好,不太合理。因為你類裡面巢狀多個類,多個類裡面又巢狀很多的時候,這樣做就會非常尷尬。所以下面來介紹深拷貝;

就是利用序列化和反序列化來實現---注意:因為我們要進行序列化,需要給對應的類加上 [serializable];

///

///序列化和反序列化實現

簡單的講就是,字串的不可變性,每次給字串進行賦值是,其實是發生了這些操作,先看看記憶體裡面是否存在相同的字串,如果不存在就去開闢乙個新的位址,那所以說,這就是為毛字串複製的時候可以複製到值,因為字串的值如果不同的話,就會去新開闢乙個記憶體。

建立型模式 原型模式

使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...

建立型模式 原型模式

原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...

原型模式 建立型模式

文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...