菜鳥上路,請多指教。
一、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 這篇博客。寫的很好。