1.1 模式概念:
- 创建型模式。
- 确保一个类只有一个实例,并且向整个系统提供这一个实例
1.2 模式结构:
- 单例 Singleton<T>,MonoSingleton<T>
1.3 代码示例:
public interface ISingleton
{
void OnSingletonInit();
}
public abstract class Singleton<T> : ISingleton where T : Singleton<T>
{
public abstract void OnSingletonInit();
private static T instance;
private static readonly object mLock = new object();
public static T Instance
{
get
{
lock (mLock)
{
if (instance == null)
{
instance = SingletonCreator.CreateSingleton<T>();
}
}
return instance;
}
}
public virtual void Dispose()
{
instance = null;
}
}
public static class SingletonCreator
{
public static T CreateSingleton<T>() where T : class, ISingleton
{
var ctors = typeof(T).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
var ctor = Array.Find(ctors, p => p.GetParameters().Length == 0);
if (ctor == null)
{
throw new Exception("Non-Public Constructors() not found! in " + typeof(T));
}
var instance = ctor.Invoke(null) as T;
return instance;
}
}
public static class SingletonProperty<T> where T : class, ISingleton
{
private static T instance;
static object mLock = new object();
public static T Instance
{
get
{
lock (mLock)
{
if (instance == null)
{
instance = SingletonCreator.CreateSingleton<T>();
}
}
return instance;
}
}
public static void Dispose()
{
instance = null;
}
}
public abstract class MonoSingleton<T> : MonoBehaviour, ISingleton where T : MonoSingleton<T>
{
public abstract void OnSingletonInit();
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
instance = MonoSingletonCreator.CreateMonoSigleton<T>();
}
return instance;
}
}
}
public static class MonoSingletonCreator
{
public static T CreateMonoSigleton<T>() where T : MonoBehaviour, ISingleton
{
T instance = null;
instance = UnityEngine.Object.FindObjectOfType(typeof(T)) as T;
if (instance == null)
{
instance = new GameObject("_" + typeof(T)).AddComponent(typeof(T)) as T;
}
return instance;
}
}
public static class MonoSingletonProperty<T> where T : MonoBehaviour, ISingleton
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
instance = MonoSingletonCreator.CreateMonoSigleton<T>();
}
return instance;
}
}
}
public class SingletonExample : MonoBehaviour
{
void Start()
{
SingletonProperty<ShowSingletonMsg>.Instance.OnSingletonInit();
}
}
public class ShowSingletonMsg : ISingleton
{
private ShowSingletonMsg()
{
}
public void OnSingletonInit()
{
UnityEngine.Debug.Log("初始化");
}
}
public class MonoSingletonExample : MonoBehaviour
{
void Start()
{
MonoSingletonProperty<ShowMonoSingleMsg>.Instance.OnSingletonInit();
}
}
public class ShowMonoSingleMsg : MonoBehaviour, ISingleton
{
public void OnSingletonInit()
{
Debug.Log("初始化");
}
}
1.4 模式分析:
- 只有一个实例,减少内存开销,避免创建和销毁产生的大量垃圾。
- 全局只有一个实例,避免繁杂的引用。
1.5 应用场景:
- 全局访问