本文由 簡悅 SimpRead 轉碼, 原文地址 mp.weixin.qq.com
單例模式
在 C# 游戲設計中,單例模式是一種常見的設計模式,它的主要目的是確保一個類只有一個實例,并提供一個全局訪問點。單例模式在游戲開發中具有以下幾個作用:
-
全局訪問點:單例模式確保只有一個類的實例存在,并提供一個全局的訪問點,這樣在整個游戲中的任何地方都可以訪問該實例。這對于管理全局的游戲狀態、資源管理器或其他共享的對象非常有用。
-
資源共享:在游戲中,可能有一些需要全局訪問的資源,例如音頻管理器、網絡管理器等。使用單例模式可以確保這些資源只有一個實例,避免資源的重復創建和管理。
2 種類型單例模式
1. 餓漢模式
形容一旦使用就占用內存,吃內存
比如使用了類的靜態成員,但是靜態成員又和實例對象無關,然后就創建了實例對象浪費資源。
創建單例類:
class Singleton
{private static Singleton instance=new Singleton();//私有的構造函數,保證在外部不能newprivate Singleton(){}//公共靜態屬性,提供全局訪問點public static Singleton Instance{get{return instance;}}//其他方法
}
使用舉例:
//在主函數使用
Singleton singleton1 = Singleton.Instance;
Singleton singleton2 = Singleton.Instance;
//就可以使用singleton這一個單例了
//這樣singleton1和singleton2都只保存了同一個對象實例,不會出現其他實例,保證了對象的單一性
2. 飽漢模式(懶漢)
靜態成員會在其所在類首次被使用時才初始化
class Singleton //飽漢懶漢模式
{private static Singleton instance;private Singleton(){}public static Singleton Instance//只有訪問了成員屬性Instance后,才會創建instance實例{get{if (instance == null){instance = new Singleton();//創建實例}return instance;}}
}
上面的屬性訪問器不是線程安全的,因為沒加鎖,下面的是線程安全的,但也就僅是創建時安全。
class Singleton //飽漢懶漢模式,線程安全版
{private static Singleton instance;private static Object obj=new Object();//用來使用lockprivate Singleton(){}public static Singleton Instance//只有訪問了成員屬性Instance后,才會創建instance實例{get{lock(obj){if (instance == null){instance = new Singleton();//創建實例}}return instance;}}
}
3.c# 提供的飽漢模式泛型類
Lazy
延遲初始化:
Lazy 會保存一個工廠方法,該方法用于創建對象。只有在第一次訪問 Lazy.Value 屬性時,工廠方法才會被調用,從而創建對象。
線程安全:
Lazy 可以配置為線程安全,這意味著在多線程環境中,只有一個線程可以執行工廠方法創建對象。這確保了對象的單一實例。
緩存:
一旦對象被創建,Lazy 會緩存該對象。后續對 Value 屬性的訪問將返回相同的對象實例。
使用 Lazy 只能解決單件實例創建時的線程安全問題,不能解決買賣物品的線程安全問題
class Singleton//c#自帶的懶漢類
{//傳入一個回調函數(委托函數)private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());private Singleton() { }public static Singleton Instance{get{return instance.Value;//調用Lazy類里面的屬性訪問器Value,然后Value就會調用上面的回調函數(lamda表達式)}}
}
總的來說,單例模式在游戲設計中提供了一種有效的方式來管理全局狀態和共享資源,使得代碼更容易維護和擴展。