Unity中C 單例模式使用總結

2021-09-19 08:25:44 字數 3278 閱讀 8069

單例模式核心在於對於某個單例類,在系統中同時只存在唯一乙個例項,並且該例項容易被外界所訪問;

意味著在記憶體中,只存在乙個例項,減少了記憶體開銷;

只存在唯一乙個例項;

提供統一對外訪問介面,使得全域性可對該單例的唯一例項進行訪問;

自行例項化(私有建構函式,不允許外界對其進行例項化)。

資源管理器,資源物件資料的載入和解除安裝(無狀態不需要例項化的物件);

單一客戶端連線伺服器等;

生命週期在遊戲中永不消毀的物件。

注意執行緒安全問題,在多執行緒、高併發的情況下,可能同時產生多個例項,違背了單例模式。

unity中如果過度使用單例模式,將會導致**耦合度非常高,指令碼與指令碼之間的耦合,**的後續拓展變得非常麻煩。乙個過分依賴單例模式的開發者不能成為乙個好的開發者,也不會去接觸到更多優秀的設計模式。個人推薦ecs 實體 - 元件式程式設計。

unity中暫時不需要考慮多執行緒問題,unity就只有乙個主線程和開啟多個輔助協程,不會出現多執行緒併發問題。

控制遊戲物件的生成和銷毀並不建議使用單例模式,可通過主遊戲邏輯ingame進行事件下發,自行管理update,使用工廠來進行物件的建立和銷毀。

1.1 提供私有建構函式;

1.2 自行例項化;

1.3 提供唯一例項,並且對外提供全域性靜態訪問介面對該例項進行訪問;

/// /// 普通模式

///

public class singleton

public static singleton getinstance()

return _instance;}}

2.1 本類內部預先自行例項化出唯一例項;

2.2 對外提供唯一訪問介面(靜態方法),對預先例項化的唯一例項進行訪問;

2.3 私有建構函式;

3.1 保證多執行緒中只存在唯一例項

/// /// 雙重鎖單例模式

///

public class singleton

public static singleton getinstance()

else // 鎖定狀態下,存在該類例項,直接返回 //}}

// 該例項本身就已經存在了,直接返回 //

return _instance;}}

4.1 在乙個案例中,我們可能需要使用到不止乙個單例模式類,甚至更多。那麼此時,使用泛型單例模式模板來實現單例模式,我們可以有兩種不同的方法來實現它:

4.2首先我們來看下泛型模板,我們對泛型類進行約束,t只能是乙個class,並且有乙個公共無參建構函式,**如下:

using system;

using unityengine;

public class singletonproviderwhere t : class ,new()

private static t _instance;

// 用於lock塊的物件

private static readonly object _synclock = new object();

public static t instance

:建立了單例物件" + typeof(t).name);}}

}return _instance;

}set }}

4.2.1 然後我們定義了乙個網路連線類 netio,使用單例提供類中的泛型t替代為具體的網路連線類進行使用:

4.2.2 使用具體類替代泛型,用泛型單例提供類對該具體類達到提供唯一例項的單例實現效果:

public class netio 

public netio()

public datetime netiocreatetime

set

}private datetime _ct;

}

4.2.4 在unity中update引數中呼叫該類,對該類建立時間進行輸出

public void update()

4.2.5 測試結果如下:

4.2.6 所有建立時間都一致,證明該類提供單例提供類中的泛型替代,達到了單例模式的效果,提供了該類的唯一例項訪問

4.3 在乙個案例中,我們可能需要使用到不止乙個單例模式類,甚至更多。那麼此時,使用泛型單例模式模板來實現單例模式,我們可以有兩種不同的方法來實現它:

4.3.1 首先我們來看下泛型模板,我們對泛型類進行約束,t只能是乙個class,並且有乙個公共無參建構函式,**如下

using system;

using unityengine;

public class singletonproviderwhere t : class ,new()

private static t _instance;

// 用於lock塊的物件

private static readonly object _synclock = new object();

public static t instance

:建立了單例物件" + typeof(t).name);}}

}return _instance;

}set }}

4.3.2 然後我們定義了乙個網路連線類 netio,使用單例提供類中的泛型t替代為具體的網路連線類進行使用:

使用具體類替代泛型,用泛型單例提供類對該具體類達到提供唯一例項的單例實現效果:

具體類中定義了字段netiocreatetime來儲存該類例項化的時間,進行下一步分析該類例項是否是唯一例項,具體類**如下:

public class netio 

public netio()

public datetime netiocreatetime

set

}private datetime _ct;

}

在unity中update引數中呼叫該類,對該類建立時間進行輸出

public void update()

測試結果如下:

所有建立時間都一致,證明該類提供單例提供類中的泛型替代,達到了單例模式的效果,提供了該類的唯一例項訪問

c 中單例模式實現總結

前言 最近個人在寫一些小的練手的專案,發現單例模式的應用實在是很廣泛,很多情況下乙個類都需要使用單例模式來實現,因此這裡我再度總結一下單例模式的實現,之前已經總結過一次,當時的例子給的是muduo的單例模式實現,這次再給出幾種其他的實現,同時進行一下比較。餓漢模式 餓漢模式就是在還未使用變數的時候,...

單例模式總結 C

單例模式 保證在整個程式中只有乙個例項,並提供乙個各個程式模組都可以訪問的介面。一 常用標準模式 include using namespace std class singleton int m x static singleton m instance public static singlet...

C 單例模式總結

c 單例模式總結 單例模式可以說是在開發過程中最常用的一種設計模式了,一般很多業務處理層都會實現單例模式。單例模式分為懶漢式和餓漢式,懶漢式是在呼叫的時候生成唯一的例項,餓漢式是在系統初始化的時候就實現例項。這裡有乙個有意思的問題,如何在不知道程式的時候,判斷單例是懶漢式或者是餓漢式?單例的實現是有...