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();

浙公网安备 33010602011771号