Unity里有两种单例模式,一种是不继承自Monobehaviour的普通单例模式,一种是继承自Monobehaviour的Unity专属的单例模式。
使用情况:
当所需要创建的单例不需要使用Unity的生命周期时,使用普通单例模式。
当所需要创建的单例模式需要Unity的生命函数时,使用Unity单例模式。
==============================
普通的抽象单例模式:
public abstract class Singleton<T> where T : Singleton<T>, new()
{
private readonly static object threadLockObj = new object();
private static T instance = null;
public static T Instance
{
get
{
if (instance == null)
{
lock (threadLockObj)
{
if (instance == null)
{
instance = new T();
}
}
}
return instance;
}
}
}
具体单例实现:
public class ResourceManager : Singleton<ResourceManager>
{
public ResourceManager()
{
//Constructor Code
}
}
创建抽象类的好处就是不用每个单例类都添加instance变量,而这里正好也是使用泛型最好的地方,因为所有单例类的Instance实现几乎都一样,正好可以用泛型。
==============================
Unity的抽象单例模式:
public abstract class SingletonMono<T> : MonoBehaviour where T : SingletonMono<T>
{
private static T instance = null;
public static T Instance
{
get
{
if (instance = null)
{
instance = FindObjectOfType<T>();
if (instance != null)
{
instance.Init();
}
}
return instance;
}
}
protected virtual void Init()
{
}
}
具体实现:
public class MessageCenter : SingletonMono<MessageCenter>
{
public override void Init()
{
}
}
因为继承Unity的类不是依靠构造函数实例化的,所以要新建一个Init函数,通过重写实现一些单例的初始化。
==============================
另外说一下Unity单例模式的缺点,就是必须在场景中有此单例的脚本,否则就会有Null Reference异常。
本文详细介绍了Unity中两种单例模式的使用情况和实现方式,包括不依赖Unity生命周期的普通单例模式和需要Unity生命函数的Unity单例模式。通过抽象类和泛型简化单例实现,同时讨论了Unity单例模式的缺点。
442

被折叠的 条评论
为什么被折叠?



