日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

Unity C# 设计模式(一)单例模式

發布時間:2024/1/17 C# 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity C# 设计模式(一)单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動機(Motivation):
??? 在軟件系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率

意圖:
??? 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。


適用性:
?? (1)當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
?? (2)當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。

代碼實現:
(1)單線程Singleton實現

/// <summary> /// 單例類 /// </summary> public class SingleThread_Singleton_Class {//靜態屬性,提供全局訪問點private static SingleThread_Singleton_Class instance=null;public static SingleThread_Singleton_Class Instance{get{ if (instance==null) {instance = new SingleThread_Singleton_Class ();}return instance;}}//私有的構造函數保證該類不能在其他類里實例化,即不能在其他類里newprivate SingleThread_Singleton_Class(){}//用于單例測試public void Print(){UnityEngine.Debug.Log ("我是單例類");} }

?

以上代碼在單線程情況下不會出現任何問題。但是在多線程的情況下卻不是安全的。
如兩個線程同時運行到?if?(instance?==?null)判斷是否被實例化,一個線程判斷為True后,在進行創建
?instance?=?new?SingleThread_Singleton();之前,另一個線程也判斷(instance?==?null),結果也為True.
這樣就就違背了Singleton模式的原則(保證一個類僅有一個實例)。
怎樣在多線程情況下實現Singleton?


(2)多線程Singleton實現:

public class MultiThread_Singleton {private static volatile MultiThread_Singleton instance=null;private static object locker=new object();private MultiThread_Singleton (){}public static MultiThread_Singleton Instance{get{ if (instance==null) {lock (locker) {if (instance==null) {instance = new MultiThread_Singleton ();}}}return instance;}}private int i=0;public void Print(){i++;UnityEngine.Debug.Log (""+i+" 次打印");} }

?

此程序對多線程是安全的,使用了一個輔助對象locker,保證只有一個線程創建實例(如果instance為空,保證只有一個線程instance?=?new?MultiThread_Singleton();創建唯一的一個實例)。(Double Check)
請注意一個關鍵字volatile,如果去掉這個關鍵字,還是有可能發生線程不是安全的。
volatile?保證嚴格意義的多線程編譯器在代碼編譯時對指令不進行微調。


(3)靜態Singleton實現

public class Static_Singleton {public static readonly Static_Singleton Instance = new Static_Singleton ();private Static_Singleton() {}public void Print(){Debug.Log ("我是靜態單例");} }

優點: 簡潔,易懂
缺點: 不可以實現帶參數實例的創建。

(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# 设计模式(一)单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。