NewSingleton
Coding Style wiki
NewSingleton<T> 為 SingletonSystem 的純 C# class 單例基類 (非 MonoBehaviour),以雙重檢查鎖定 (Double-Checked Locking) 的延遲建立 (new T()) 確保多線程下僅建立一次實例,適用於不需要掛載於 GameObject 的資料或邏輯管理類。
| 命名空間 | OxGKit.SingletonSystem |
| 類型 | public class NewSingleton<T> where T : class, new() |
| 原始碼 | NewSingleton.cs |
using OxGKit.SingletonSystem;
注意 泛型約束為 where T : class, new(),類型 T 必須具備 public 無參數建構子。
提醒 需要 Unity 生命週期與場景物件的管理類,請改用 MonoSingleton。
快速上手
using OxGKit.SingletonSystem;
// 方式一:繼承使用
public class ScoreManager : NewSingleton<ScoreManager>
{
public int score = 0;
public static void AddScore()
{
GetInstance().score++;
}
}
// 取得實例 (延遲 new T() 建立)
var scoreManager = ScoreManager.GetInstance();
ScoreManager.AddScore();
// 方式二:不繼承,直接作為泛型容器使用
public class ScoreService
{
public int score = 0;
}
NewSingleton<ScoreService>.GetInstance().score++;
方法總覽
| 方法 | 說明 |
|---|---|
| GetInstance | 取得單例實例 (延遲建立)。 |
| InitInstance | 初始單例實例 (等同呼叫 GetInstance)。 |
| CheckInstanceExists | 檢查實例是否存在。 |
| DestroyInstance | 銷毀單例實例 (僅清空靜態引用)。 |
GetInstance
public static T GetInstance()
取得單例實例;若實例尚不存在,以雙重檢查鎖定確保多線程競爭下僅以 new T() 建立一次。
var scoreManager = ScoreManager.GetInstance();
InitInstance
public static void InitInstance()
初始單例實例 (等同呼叫 GetInstance),適合於開機流程明確控制建立順序 (warm-up)。
ScoreManager.InitInstance();
CheckInstanceExists
public static bool CheckInstanceExists()
檢查實例是否存在 (不會觸發建立)。
if (ScoreManager.CheckInstanceExists())
ScoreManager.AddScore();
DestroyInstance
public static void DestroyInstance()
銷毀單例實例 (僅清空靜態引用);若其他地方仍持有舊實例的引用,該物件並不會因此被釋放,並非 資源釋放機制。
ScoreManager.DestroyInstance();
注意 清空後再次呼叫 GetInstance 會建立全新實例,舊實例的狀態不會保留。