前言
懒加载和饿汉加载单例模式。
1 懒汉模式
1.1 非MonoBehaviour类
public class LazySingleton<T> where T : LazySingleton<T>
{
private static T mInstance = new Lazy<T>(() =>
{
ConstructorInfo[] ctors;
var type = typeof(T);
ctors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public);
if (ctors.Length != 0)
{
throw new Exception("Singleton cannot have Public Constructor()!");
}
ctors = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
var ctor = Array.Find(ctors, c => c.GetParameters().Length == 0);
if (ctor == null)
{
throw new Exception("NonPublic Constructor() not found in " + typeof(T));
}
mInstance = ctor.Invoke(null) as T;
return mInstance;
}).Value;
public static T Instance => mInstance;
}
1.2 MonoBehaviour类
public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
private static T instance;
public static T Instance => instance;
protected virtual void Awake()
{
if (instance != null)
{
Destroy(gameObject);
}
else
{
instance = (T)this;
DontDestroyOnLoad(gameObject);
}
}
public static bool IsInitalized => instance != null;
protected virtual void OnDestroy()
{
if (instance == this) instance = null;
}
}
2 饿汉模式(仅为模板代码不用于继承)
public class HungrySingletonTemplate__
{
private static HungrySingletonTemplate__ instance;
public static HungrySingletonTemplate__ Instance => instance;
HungrySingletonTemplate__() { }
static HungrySingletonTemplate__()
{
instance = new HungrySingletonTemplate__();
}
}