设计模式---单例模式---14

单例就不多说了!

1.饿汉模式

public sealed class Singleton
{
    private static Singleton instance = new Singleton();

    private Singleton() { }

    public static Singleton Instance
    {
        get { return instance; }
    }
}

2.懒汉模式

public sealed class Singleton
{
    private static Singleton instance = null;

    private static object locker = new object();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (locker)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

3.泛型饿汉模式:

public class Singleton<T> where T : Singleton<T>
{
    private static T instance = null;   

    private Singleton() { }

    static Singleton()
    {
        var type = typeof(T);
        var cons = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);

        var ctor = Array.Find(cons, c => c.GetParameters().Length == 0);

        if (ctor == null)
        {
            throw new Exception($"未找到派生类{typeof(T)}:无参私有构造函数");
        }

        instance = ctor.Invoke(null) as T;   
    }

    public static T Instance
    {
        get
        {
            return instance;
        }
    }
}

4.泛型懒汉模式:派生类构造自己私有化

public class Singleton<T> where T : Singleton<T>
{
    private static T instance = default;

    private static object locker = new object();

    private Singleton() { }

    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                lock (locker)
                {
                    if (instance == null)
                    {                      
                        var type = typeof(T);
				        var cons = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
				
				        var ctor = Array.Find(cons, c => c.GetParameters().Length == 0);
				
				        if (ctor == null)
				        {
				            throw new Exception($"未找到派生类{typeof(T)}:无参私有构造函数");
				        }
				
				        instance = ctor.Invoke(null) as T;   
                        }
                    }
                }
            }
            return instance;
        }
    }
}

5.Unity脚本单例:

    public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
    {
        private static object locker = new object();       
        private static T instance;
        public static T Instance
        {
            get
            {              
                if (instance == null)
                {
                    lock (locker)
                    {                        
                        instance = FindObjectOfType<T>();
                        if (instance == null)
                        {
                            new GameObject("Singlton_" + typeof(T)).AddComponent<T>();//立即执行Awake
                        }
                        else
                        {
                            instance.Init();
                        }
                    }
                }
                return instance;
            }
        }
       
        public bool isDontDestroy;      
        protected void Awake()
        {
            if (instance == null)
            {
                instance = this as T;
                Init();
            }
        }
        
        public virtual void Init()
        {
            if (isDontDestroy)
                DontDestroyOnLoad(gameObject);
        }
    }

6.另一种Unity脚本单例:abstract可以让脚本不能添加到GameObject上。

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    private static T instance = null;   

    static MonoSingleton()
    {
        var go = new GameObject($"MonoSingleton_{typeof(T)}");
        instance = go.AddComponent<T>();
        DontDestroyOnLoad(go);
    }

    public static T Instance
    {
        get
        {
            return instance;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值