【Unity】提高开发效率——泛型单例

【Unity】提高开发效率——泛型单例
在创建一个Unity工程的时候,第一步应该是搭建部分框架,准备好一些工具代码。

1.泛型单例:在Unity中,只要是继承自MonoBehaviour的类都是不支持多线程的,但并不意味着我们可以随意使用单例,因为我们使用泛型单例的目的主要是方便Manager类的复用,而这些类往往不需要去继承MonoBehaviour。

带有static的单例看需使用,如果确定一定会用到,那么就可以选择静态常量或者静态代码块式的单例。一般优先选择的是DoubleCheck形式的单例,这种单例是线程安全的,而且是用到的时候才会new,不会浪费栈上的空间。

public class Singleton where T : class, new()
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
                instance = new T();
            return instance;
        }
    }
}

这种单例如果在判断的时候有多个进程在执行,可能会new出来两个对象,可以通过加锁来解决,可以lock即可

public class Singleton where T : class, new()
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                lock (instance)
                {
                    if (instance==null)
                    {
                        instance = new T();
                    }
                }
            }
            return instance;
        }
    }
}

lock就等同于对monitor的一个封装,lock(){}完全等同于:

//来自官方文档
object __lockObj = x;
bool __lockWasTaken = false;
try
{
    System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
    // Your code...
}
finally
{
    if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}

而在Unity中,不需要考虑多线程,使用如下代码即可:

public class Singleton<T> where T : class, new()
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new T();
            }
            return instance;
        }
    }
}

泛型单例的具体运用如下:

class A : Singleton<A>
{

}

有不对的地方请指正,希望对大家有所帮助

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值