Unity 游戲設計模式:單例模式

本文由 簡悅 SimpRead 轉碼, 原文地址 mp.weixin.qq.com

單例模式

在 C# 游戲設計中,單例模式是一種常見的設計模式,它的主要目的是確保一個類只有一個實例,并提供一個全局訪問點。單例模式在游戲開發中具有以下幾個作用:

  1. 全局訪問點:單例模式確保只有一個類的實例存在,并提供一個全局的訪問點,這樣在整個游戲中的任何地方都可以訪問該實例。這對于管理全局的游戲狀態、資源管理器或其他共享的對象非常有用。

  2. 資源共享:在游戲中,可能有一些需要全局訪問的資源,例如音頻管理器、網絡管理器等。使用單例模式可以確保這些資源只有一個實例,避免資源的重復創建和管理。

2 種類型單例模式

1. 餓漢模式

形容一旦使用就占用內存,吃內存

比如使用了類的靜態成員,但是靜態成員又和實例對象無關,然后就創建了實例對象浪費資源。

創建單例類:

class Singleton
{private static Singleton instance=new Singleton();//私有的構造函數,保證在外部不能newprivate Singleton(){}//公共靜態屬性,提供全局訪問點public static Singleton Instance{get{return instance;}}//其他方法
}

使用舉例:

//在主函數使用
Singleton singleton1 = Singleton.Instance;
Singleton singleton2 = Singleton.Instance;
//就可以使用singleton這一個單例了
//這樣singleton1和singleton2都只保存了同一個對象實例,不會出現其他實例,保證了對象的單一性

2. 飽漢模式(懶漢)

靜態成員會在其所在類首次被使用時才初始化

class Singleton //飽漢懶漢模式
{private static Singleton instance;private Singleton(){}public static Singleton Instance//只有訪問了成員屬性Instance后,才會創建instance實例{get{if (instance == null){instance = new Singleton();//創建實例}return instance;}}
}

上面的屬性訪問器不是線程安全的,因為沒加鎖,下面的是線程安全的,但也就僅是創建時安全。

class Singleton //飽漢懶漢模式,線程安全版
{private static Singleton instance;private static Object obj=new Object();//用來使用lockprivate Singleton(){}public static Singleton Instance//只有訪問了成員屬性Instance后,才會創建instance實例{get{lock(obj){if (instance == null){instance = new Singleton();//創建實例}}return instance;}}
}

3.c# 提供的飽漢模式泛型類

Lazy

延遲初始化:

Lazy 會保存一個工廠方法,該方法用于創建對象。只有在第一次訪問 Lazy.Value 屬性時,工廠方法才會被調用,從而創建對象。

線程安全:

Lazy 可以配置為線程安全,這意味著在多線程環境中,只有一個線程可以執行工廠方法創建對象。這確保了對象的單一實例。

緩存:

一旦對象被創建,Lazy 會緩存該對象。后續對 Value 屬性的訪問將返回相同的對象實例。

使用 Lazy 只能解決單件實例創建時的線程安全問題,不能解決買賣物品的線程安全問題

class Singleton//c#自帶的懶漢類
{//傳入一個回調函數(委托函數)private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());private Singleton() { }public static Singleton Instance{get{return instance.Value;//調用Lazy類里面的屬性訪問器Value,然后Value就會調用上面的回調函數(lamda表達式)}}
}

總的來說,單例模式在游戲設計中提供了一種有效的方式來管理全局狀態和共享資源,使得代碼更容易維護和擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Matlab 機器人工具箱 Link類

文章目錄 1 Link類1.1 機械臂Link類1.2 構造函數1.3 信息/顯示方法1.4 轉換方法1.5 操作方法1.6 測試方法1.7 重載操作1.8 屬性(讀/寫)1.9 例子2 Link.Link2.1 創建機器人連桿對象2.2 OPTIONS2.3 注意2.4 舊語法2.5 例子3 Link的其他函數3.1 Link.A3.2 Link.char3.3 Link.displ…

unity學習(44)——選擇角色菜單——順利收到服務器的數據

本節的思路參考自&#xff0c;內容并不相同&#xff1a;13ARPG網絡游戲編程實踐&#xff08;十三&#xff09;&#xff1a;角色選擇UI及創建面板制作&#xff08;四&#xff09;_嗶哩嗶哩_bilibili 現在的代碼寫在MessageManager.cs中&#xff0c;函數名UserHandler(是從OnMess…

Revit-二開之創建墻-(6)

Revit API窗間墻 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements) {try{// 獲取當前活動的文檔

你是否知道Python的列表翻轉、排序和多維列表

1.reverse() 表示翻轉列表中的元素&#xff0c;不會生成新列表 list1 [2343, 55, 4, 345, 676, 768] list1.reverse() print(list1) # [768, 676, 345, 4, 55, 2343] 2.sort() 對原列表元素進行排序&#xff0c;默認是升序 list1 [2343, 55, 4, 345, 676, 768] list1…

騰訊云幻獸帕魯服務器在Linux和Windows操作系統上的安全性對比如何?哪個更加安全?

騰訊云幻獸帕魯服務器在Linux和Windows操作系統上的安全性對比如何&#xff1f; Linux因其資源利用率高、穩定性和安全性較強而受到許多專業用戶的青睞。這表明在Linux操作系統上&#xff0c;騰訊云可能會更傾向于提供高安全性的服務環境。然而&#xff0c;并沒有直接比較Linu…

MySql--死鎖

一、什么是mysql死鎖? MySQL中的死鎖是指多個事務同時請求對同一資源進行操作(讀或寫),并且由于資源被互斥地鎖定,導致彼此無法繼續進行。當發生死鎖時,MySQL會自動選擇其中一個事務作為死鎖的犧牲者,回滾該事務,并釋放鎖定的資源,從而解除死鎖。 以下是一些處理MyS…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜視行人檢測系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發高效的夜視行人檢測系統對于提升夜間安全和監控效能至關重要。本篇博客詳盡介紹了如何利用深度學習技術搭建一個夜視行人檢測系統&#xff0c;并提供了完整的實現代碼。本系統采用了先進的YOLOv8算法&#xff0c;并與YOLOv7、YOLOv6、YOLOv5進行了性能比較…

嵌入式Linux中GPIO設置的一些基本指令和步驟

一、GPIO的介紹 嵌入式Linux中的GPIO&#xff08;General Purpose Input/Output&#xff0c;通用輸入/輸出&#xff09;是一種常用的接口&#xff0c;允許開發者直接控制硬件設備的某些引腳&#xff0c;進行諸如LED控制、傳感器讀取、設備狀態監測等任務。 二、設置步驟和示例…

藍橋杯復習之二分法與前綴和

題目&#xff1a;最佳牛圍欄 題目鏈接&#xff1a;https://www.acwing.com/problem/content/104/ 題意&#xff1a;農夫約翰的農場由 N 塊田地組成&#xff0c;每塊地里都有一定數量的牛&#xff0c;其數量不會少于 1 頭&#xff0c;也不會超過 2000 頭。 約翰希望用圍欄將一…

GEE學習筆記003-訪問asset文件

在 Google Earth Engine (GEE) 中&#xff0c;您可以通過將 asset 文件的路徑直接寫入代碼中來引用它。這是通過在文件路徑前加上 ee.Image() 或 ee.FeatureCollection() 來實現的&#xff0c;具體取決于您想要導入的是影像還是矢量數據。 以下是導入 asset 文件并將其直接寫入…

第四十四天| 卡爾網 52. 攜帶研究材料、518. 零錢兌換 II、377. 組合總和 Ⅳ

01背包問題卡爾網 52. 攜帶研究材料 題目鏈接&#xff1a;52 攜帶研究材料 題干&#xff1a;小明是一位科學家&#xff0c;他需要參加一場重要的國際科學大會&#xff0c;以展示自己的最新研究成果。他需要帶一些研究材料&#xff0c;但是他的行李箱空間有限。這些研究材料包括…

centos7安裝夜鶯

一、前期準備 1.1.關閉防火墻&#xff0c;SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看狀態 systemctl status firewalld systemctl sta…

Vue開發實例(三)項目引入Element-UI

項目引入Element-UI 一、引入Element-UI二、注冊組件1、vue2使用element-ui2、vue3使用element-ui 三、使用Element組件1、輕微改造2、驗證element是否生效 一、引入Element-UI npm i element-ui --save npm install element-ui -S等待安裝完成 二、注冊組件 1、vue2使用ele…

【Leetcode每日一題】前綴和(難度?)(25)

1. 題目解析 題目鏈接&#xff1a;DP34 【模板】前綴和 這個問題的理解其實相當簡單&#xff0c;只需看一下示例&#xff0c;基本就能明白其含義了。 核心在于計算題目所給區間數組元素和返回即可。 2. 算法原理 為了提高計算效率&#xff0c;我們可以預先計算出一個「前綴…

在github的README.md中插入視頻;在github的README.md中添加gif演示動畫

最近需要再github中上傳項目的源代碼&#xff0c;應導師的要求&#xff0c;需要再README中加入對實驗視頻的展示&#xff0c;但是github的README.md其實就是一個markdown文件&#xff0c;據我的理解這個文件里應該無法直接插入視頻吧&#xff1f;&#xff08;如果后續有辦法直接…

UE4c++ ConvertActorsToStaticMesh ConvertProceduralMeshToStaticMesh

UE4c ConvertActorsToStaticMesh 創建Edior模塊&#xff08;最好是放Editor模塊畢竟是編輯器代碼&#xff09;創建藍圖函數UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目標:為了大量生成模型&#xff0c;我們把虛幻帶有的方法遷移成函…

機器學習_10、集成學習-隨機森林

隨機森林算法 隨機森林&#xff08;Random Forest&#xff09;是一種集成學習方法&#xff0c;特別用于分類、回歸和其他任務&#xff0c;它通過構建多個決策樹&#xff08;Decision Trees&#xff09;在訓練時進行預測&#xff0c;并采用平均或多數投票的方式來提高整體模型的…

【vue】keep-alive清除緩存最簡單暴力的方法

項目場景&#xff1a; 場景一&#xff1a; 使用vue開發移動端&#xff0c; 有ABC三個頁面&#xff0c;點擊A跳轉到B&#xff0c;點B跳轉到C&#xff1b; 點C返回B&#xff0c;點B返回A。 場景二&#xff1a; 場景一實現之后&#xff0c;會出現這樣一個問題&#xff1a; 先從A跳…

LeetCode 每日一題 2024/2/26-2024/3/3

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄 2/26 938. 二叉搜索樹的范圍和2/27 2867. 統計樹中的合法路徑數目2/28 2673. 使二叉樹所有路徑值相等的最小代價2/29 2581. 統計可能的樹根數目3/1 2369. 檢查數組是否存在…

leetcode 熱題 100_三數之和

題解一&#xff1a; 雙指針遍歷&#xff1a;暴力解法的三層遍歷會超時&#xff0c;因此需要優化遍歷的過程。首先是需要對結果進行去重&#xff0c;這里采用排序跳過重復值的做法&#xff0c;在指針遍歷時跳過已經遍歷過的相同值。在第一層循環確定第一個值后&#xff0c;剩下兩…