今天學習了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 標準只要求這個物件在第一次被使用前,它的...