跳到主要内容

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 会创建全新实例,旧实例的状态不会保留。