C 中的單例建立模式

2021-09-02 23:31:49 字數 2359 閱讀 6147

今天學習了c#中的單例建立模式,單例的主要特點是不根據使用者程式呼叫來生成乙個新的例項,控制並保證程式中某個型別的例項的唯一性。

作用:單例模式就是保證在整個應用程式的生命週期中,在任何時刻,被指定的類只有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。(例如:rpg遊戲,全程只有乙個玩家)

下面是簡單的寫法:

1.經典寫法:

using system;

namespace lesson17_2

//2.需要在類的內部提供乙個靜態例項

private static player _instance;

//3.提供獲取例項的介面

public static player getinstance ()

return _instance;

} public string name = "dzzhyk";

public int level = 10;

public int hp = 10;

public int maxhp = 100;

} //定義乙個對主角操作的類

public class a

} class mainclass }

}

上面的**就定義了乙個玩家player類,並且使用了單例的建立模式。

侷限:在這種經典模式下,沒有考慮執行緒併發獲取例項問題,即可能出現兩個執行緒同時獲取instance例項,且此時其為null時,就會出現兩個執行緒分別建立了instance,違反了單例規則。因此,需對上面**修改。 

2.因為經典的單例建立模式對多執行緒不是太友好,因此就有改進了的多執行緒下的單例模式:

public class singleton

public static singleton getinstance()}}

return instance;

}}

上述**使用了雙重鎖方式較好地解決了多執行緒下的單例模式實現。

先看內層的if語句塊,使用這個語句塊時,先進行加鎖操作,保證只有乙個執行緒可以訪問該語句塊,進而保證只建立了乙個例項。再看外層的if語句塊,這使得每個執行緒欲獲取例項時不必每次都得加鎖,因為只有例項為空時(即需要建立乙個例項),才需加鎖建立,若果已存在乙個例項,就直接返回該例項,節省了效能開銷。這樣最終的效果就是,多執行緒也最終只存在乙個例項物件。

3.第三種寫法目前沒有看懂:

餓漢寫法:

public sealed class singleton

public static singleton getinstance()

}

上面使用的readonly關鍵可以跟static一起使用,用於指定該常量是類別級的,它的初始化交由靜態建構函式實現,並可以在執行時編譯。在這種模式下,無需自己解決執行緒安全性問題,clr會給我們解決。由此可以看到這個類被載入時,會自動例項化這個類,而不用在第一次呼叫getinstance()後才例項化出唯一的單例物件。

單例模式的優點:

單例模式(singleton)會控制其實例物件的數量,從而確保訪問物件的唯一性。

例項控制:單例模式防止其它物件對自己的例項化,確保所有的物件都訪問乙個例項。 

伸縮性:因為由類自己來控制例項化程序,類就在改變例項化程序上有相應的伸縮性。

單例模式的缺點:

系統開銷。雖然這個系統開銷看起來很小,但是每次引用這個類例項的時候都要進行例項是否存在的檢查。這個問題可以通過靜態例項來解決。 

開發混淆。當使用乙個單例模式的物件的時候(特別是定義在類庫中的),開發人員必須要記住不能使用new關鍵字來例項化物件。因為開發者看不到在類庫中的源**,所以當他們發現不能例項化乙個類的時候會很驚訝。 

物件生命週期。單例模式沒有提出物件的銷毀。在提供記憶體管理的開發語言(比如,基於.netframework的語言)中,只有單例模式物件自己才能將物件例項銷毀,因為只有它擁有對例項的引用。在各種開發語言中,比如c++,其它類可以銷毀物件例項,但是這麼做將導致單例類內部的指標指向不明。

單例適用性:

使用singleton模式有乙個必要條件:在乙個系統要求乙個類只有乙個例項時才應當使用單例模式。反之,如果乙個類可以有幾個例項共存,就不要使用單例模式。

不要使用單例模式訪問全域性變數。這違背了單例模式的用意,最好放到對應類的靜態成員中。

不要將資料庫連線做成單例,因為乙個系統可能會與資料庫有多個連線,並且在有連線池的情況下,應當盡可能及時釋放連線。singleton模式由於使用靜態成員儲存類例項,所以可能會造成資源無法及時釋放,帶來問題。

參考:好文:

設計模式 建立模式 單例 C 描述

second60 20180425 單例是23種設計模式中最常用的,沒有之一。一句話,單例就是乙個全域性變數 物件 在整個程式生命週期,只有乙個例項。單例的實現很簡單。在c 中,用 static 函式和static 變數來實現或用模來來繼承。class singleton private stati...

設計模式(一)單例模式 建立模式

先聊一下關於設計的幾個原則 設計模式 1 單例模式 建立模式 注意事項 1.允許子類派生 2.不要實現 icloneable 介面 這個介面繼承後可能會導致生成多個示例,違背了模式的原本意思 3.不要序列化 理由同上 4.不要再多執行緒下使用,如果需要再多執行緒下使用的話見下面舉例 單利模式作用 1...

C 中單例模式

最簡單的單例實現只需要乙個全域性物件 some class the instance some class get instance 這個實現簡單到沒什麼可說,它在絕大多數情況下能正常工作,之所以說是 絕大多數 主要原因是 2 構造的時間點其實是不確定的,c 標準只要求這個物件在第一次被使用前,它的...