侧边栏

Unity QFrameWork--Singleton

Singleton

using System;
using System.Reflection;
namespace QFramework{
public class Singleton<T> where T : Singleton<T>
{
private static T mInstance;
public static T Instance
{
get{
if(mInstance == null){
var type = typeof(T);
var ctors = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
var ctor = Array.Find(ctors,c => c.GetParameters().Length == 0);
if(ctor == null){
throw new Exception("Non Public Constructor Not Found in " + type.Name);
}
mInstance = ctor.Invoke(null) as T;
}
return mInstance;
}
}
}
}

代码解释

实现了一个泛型单例模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
mInstance 是一个静态字段,用于存储单例实例。由于是静态的,它在整个应用程序生命周期中只会存在一个实例。
Instance 是一个静态属性,用于获取单例实例。只有在第一次访问 Instance 属性时才会创建实例(懒加载)。
下面是反射说明:
反射:

  • typeof(T) 获取类型 T 的 Type 对象。
  • GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic) 获取类型 T 的所有非公共实例构造函数。
  • Array.Find(ctors, c => c.GetParameters().Length == 0) 查找无参构造函数。如果找不到无参构造函数,抛出异常。
  • ctor.Invoke(null) 调用无参构造函数创建实例。
  • as T 将创建的对象转换为 T 类型并赋值给 mInstance。

用法说明

可以看下面的示例
把需要的变成单例的继承Singleton每次获取单例用T.Instance来获取实例
这种实现方式确保了单例的线程安全(在单线程环境下),但在多线程环境下可能需要额外的同步机制来确保线程安全。
所以可以使用IOC容器来管理单例

下面是示例

public class MyManager : Singleton<MyManager>
{
private MyManager() { } // 私有构造函数
public void DoSomething()
{
Console.WriteLine("Doing something...");
}
}
//私有构造函数:确保外部无法直接实例化 MyManager
var manager = MyManager.Instance;
manager.DoSomething();
posted @   Z-wzy  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
电磁波切换