跳至主要内容

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 會建立全新實例,舊實例的狀態不會保留。