第十七章 单例模式

单例模式(Singleton),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。并且提供一个访问它的全局访问点。

Singleton 类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。

单线程时候的单例类

class Singleton
    {
         //私有静态实例
        private static Singleton instance; 
        //私有化无参构造 不能在类外部创建实例
        private Singleton()
        {

        }
        //此方式是获取本类的唯一实例
        public static Singleton GetInstance()
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

多线程时候的单例类

多线程的程序中,多个线程同时,注意是同时访问Singleton类,调用GetInstance()方法,会有可能创建多个实例。所以可以给进程加一把锁来处理,lock是确保当一个线程位于代码的临街区时,另一个线程不能够进入临界区,如果其他线程试图进入锁定的代码,则它将会一直等待(即被阻止),直到该对象被释放。

class Singleton
    {
        private static Singleton instance;
        //程序运行时创建一个静态只读的进程辅助对象;
        private static readonly object syncRoot = new object();

        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            //在同一个时刻加了锁的那部分程序只有一个线程可以访问;
            lock (syncRoot)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
            return instance;
        }
    }

双重锁定单例类

当同时有两个线程调用了GetInstance()方法时,他们都可以通过第一重的instance==null的判断,然后由于lock机制,只有一个线程进入,另一个排队等候,当第一个释放了之后,如果没有第二重instance==null判定,就可能创建出两个实例。

class Singleton
    {
        private static Singleton instance;
        private static readonly object syncRoot = new object();
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            if (instance==null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

unity常用的两种单例模式

1.这个是不继承自MonoBehaviour的,通常用在不使用unity特性的脚本
public class Singleton
{
    private static T _instance;

    protected Singleton()
    {
        Init();
    }

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = Activator.CreateInstance();                
            }
            return _instance;
        }
    }
    protected virtual void Init() { }
}
2.继承自MonoBehaviour的单例 拥有Awake() Start() Update() 方法 等unity特性的 单例。
abstract public class MonoSingleton : MonoBehaviour where T : MonoSingleton
{
    private static bool _bIsDestroy = false;
    private static T _instance = null;

    void Awake()
    {
        AwakeHandle();
    }

    public static T Instance
    {
        get
        {
            if (_instance == null && !_bIsDestroy)
            {
                _instance = FindObjectOfType(typeof(T)) as T;
                
                if (_instance == null)
                {
                    GameObject obj = new GameObject(typeof(T).Name, typeof(T));
                    _instance = obj.GetComponent() as T;
                    //if (typeof(T).Equals(typeof(MonsterController)))
                    //{
                        //Debug.Log("new MonoSingle");
                    //}
                }
                _bIsDestroy = false;
            }
            return _instance;
        }
    }

你可能感兴趣的:(第十七章 单例模式)