Unity C# 设计模式(一)单例模式
動機(Motivation):
??? 在軟件系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率
意圖:
??? 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
適用性:
?? (1)當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
?? (2)當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。
代碼實現:
(1)單線程Singleton實現
?
以上代碼在單線程情況下不會出現任何問題。但是在多線程的情況下卻不是安全的。
如兩個線程同時運行到?if?(instance?==?null)判斷是否被實例化,一個線程判斷為True后,在進行創建
?instance?=?new?SingleThread_Singleton();之前,另一個線程也判斷(instance?==?null),結果也為True.
這樣就就違背了Singleton模式的原則(保證一個類僅有一個實例)。
怎樣在多線程情況下實現Singleton?
(2)多線程Singleton實現:
?
此程序對多線程是安全的,使用了一個輔助對象locker,保證只有一個線程創建實例(如果instance為空,保證只有一個線程instance?=?new?MultiThread_Singleton();創建唯一的一個實例)。(Double Check)
請注意一個關鍵字volatile,如果去掉這個關鍵字,還是有可能發生線程不是安全的。
volatile?保證嚴格意義的多線程編譯器在代碼編譯時對指令不進行微調。
(3)靜態Singleton實現
優點: 簡潔,易懂
缺點: 不可以實現帶參數實例的創建。
(4)Unity?Singleton腳本
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 單例腳本 /// </summary> public class SingleThread_Singleton_Script : MonoBehaviour {private SingleThread_Singleton_Script(){}public static SingleThread_Singleton_Script instance;void Awake(){instance = this;//初始化}public void Print(){Debug.Log ("我是單例腳本");} }風險:
1、外部類依然可以同過GetComponent<>的形式實例化出該對象。
2、當單例腳本一旦被初始化后,即當程序運行后,從場景中去掉單例腳本組件,還是可以會執行該類的相關方法
轉載于:https://www.cnblogs.com/Jason-c/p/8776639.html
總結
以上是生活随笔為你收集整理的Unity C# 设计模式(一)单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.Easy Touch 3.1
- 下一篇: EF三种编程方式详细图文教程(C#+EF