【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>
{
}
有不对的地方请指正,希望对大家有所帮助