侧边栏

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 @ 2025-01-08 21:17  Z-wzy  阅读(67)  评论(0)    收藏  举报