Unity QFrameWork--Singleton
1.Unity QFrameWork--Architecture2.Unity QFrameWork--Event3.Unity QFrameWork--使用规则4.Unity QFrameWork--IOC
5.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();
合集:
QFramework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现