1. 程式人生 > >【設計模式-2】單例模式

【設計模式-2】單例模式

優點:

  • 記憶體在系統執行過程中只有一個例項,減少記憶體開銷。
  • 允許可變數目的例項
  • 其他類通過唯一的全域性例項,可以方便訪問單例中的方法和變數。
  • 單例可在第一次使用時候,進行例項化,不必在系統剛啟動就初始化。一定程度上可以控制自己例項化程序。

缺點:

  • 過多的其他類中通過單例訪問全域性方法和變數,可能跟其他類造成過度耦合。
  • 沒有介面擴充套件困難
  • 過多的單例,造成效能問題

適用場景:

  1.  資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案,應用配置。 
  2.  控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。 
  3.  需要定義大量的靜態常量和靜態方法(如工具類)的環境,可以採用單例模式

Unity3d中實現單例泛型類方法:

public class UnitySingleton<T> : MonoBehaviour where T:Component {
        private static T _instance;
        public static T GetInstance()        
        {
            if(_instance == null)
            {
                //如果沒有型別為T的類物件
                _instance = FindObjectOfType(typeof(T)) as T;
                if(_instance == null)
                {
                    GameObject tempObject = new GameObject ();
                    tempObject.hideFlags = HideFlags.HideAndDontSave;
                    _instance = (T) tempObject.AddComponent(typeof(T));
                    Object.DontDestroyOnLoad(tempObject);
                }
            }
            return _instance;
        }
}

某個類需要單例,繼承即可,如下:

public class YourSelfScriptName :UnitySingleton<YourSelfScriptName>

{

}
 

單例模式比靜態方法的優點:

從另一個角度考慮,如果一個方法和它所在類的例項物件無關,那麼它就應該是靜態的,否則就應該是非靜態。因此像工具類,一般都是靜態的。

 

  1. 單例可以繼承類,實現介面,而靜態類不能(可以整合類,但不能整合例項成員);
  2. 單例可以被延遲初始化,靜態類一般在第一次載入是初始化;
  3. 單例類可以被整合,單例裡邊的方法可以被重寫;
  4. 最重要的是,單例類可以被用於多型而無需強迫使用者只假定唯一的例項。舉個例子,你可能在開始時只寫一個配置,但是以後你可能需要支援超過一個配置集,或者可能需要允許使用者從外部從外部檔案中載入一個配置物件,或者編寫自己的。你的程式碼不需要關注全域性的狀態,因此你的程式碼會更加靈活(允許可變數目的例項)

參考:

https://blog.csdn.net/yupu56/article/details/54144262

http://www.manew.com/thread-99522-1-1.html

https://blog.csdn.net/yupu56/article/details/53668688