Unity中的单例模式

菜鸟上路,请多指教。

一、Unity中继承MonoBehaviour下的单例

using UnityEngine;

public class Singleton : MonoBehaviour {

    //私有化构造方法,不能new对象,只能通过Singleton.instance的方法得到对象
    private Singleton() { }

    public static Singleton instance;

    void Awake () {
        instance = this;
    }
	
}

这种方法比较简单,需要注意的当前场景中只能有一个物体挂载此脚本。在其他类中通过Singleton.instance得到的对象就是该物体上挂载的脚本对象。

二、C#中单例的实现

饿汉模式

public class Singleton
{
    //很饿,启动时就创建单例对象
    private static Singleton mInstance=new Singleton();
    //私有化构造方法,不能new对象,只能通过Singleton.instance的方法得到对象
    private Singleton() { }
    //得到单例对象
    public static Singleton instance
    {
        get
        {
            return mInstance;
        }
    }

}

饿汉模式因为比较饿,所以在程序启动的时候就会创建一个Singleton对象,程序运行中,调用Singleton.instance直接得到一开始创建的对象。

懒汉模式

public class Singleton
{
    //很懒,启动时不创建单例对象。
    private static Singleton mInstance;
    //私有化构造方法,不能new对象,只能通过Singleton.instance的方法得到对象
    private Singleton() { }
    //得到单例对象
    public static Singleton instance
    {
        get
        {
            //判断mInstance是否为空,为空时是第一次调动该方法。创建Singleton对象返回,不为空 
            //说明不是第一次进入。返回上一次创建的对象。当两个线程同时第一次进入这里,会都判断到
            //mInstance为空,而创建两个Singleton对象返回。所以时线程不安全的。
            if (mInstance == null)
            {
                mInstance = new Singleton();
            }
            return mInstance;
        }
    }

}

懒汉模式因为比较懒,所以在程序启动的时候并不会创建Singleton对象。程序运行中,调用Singleton.instance会判断mInstance是否为空。如果为空,就创建一个返回。如果不为空,说明之前已经创建过了,返回它就完事儿了。

存在既有道理,饿汉与懒汉相对都有自己的优势。懒汉模式相对与饿汉模式的优点在与在程序启动时不会创建单例对象,节省了时间。运行时会根据需要创建对象。但是饿汉模式是线程不安全的。在多线程的情况下,可能两个线程同时第一次进入到if块中,判断mInstance为空,而返回两个对象。懒汉模式虽然增加了启动时间,但是它的对象开始就有了,不会发生线程不安全的情况。

对于懒汉模式使之线程安全还有其他方法可以参考https://www.cnblogs.com/kmsfan/p/4562323.html 这篇博客。写的很好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章