Singleton設計模式

2021-04-27 16:46:47 字數 1047 閱讀 9757

1 singleton模式。

singleton(譯為單件或單態)模式是設計模式中比較簡單而常用的模式。

有些時候在整個應用程式中,會要求某個類有且只有乙個例項,這個時候可以採用singleton模式進行設計。用singleton模式設計的類不僅能保證在應用中只有乙個例項,而且提供了一種非全域性變數的方法進行全域性訪問,稱為全域性訪問點,這樣對於沒有全域性變數概念的純物件導向語言來說是非常方便的,比如c#。

本文用乙個計數器的例子來描述在c#中如何使用singleton模式:計數的值設計為計數器類的乙個私有成員變數,它被4個不同的執行緒進行讀寫操作,為保證計數的正確性,在整個應用當中必然要求計數器類的例項是唯一的。

2 singleton的實現方式。

首先看看教科書方式的singleton標準實現的兩種方法,以下用的是類c#偽**: 

方法一:

singleton模式的實現有兩個技巧:一是使用靜態成員變數儲存「全域性」的例項,確保了唯一性,使用靜態的成員方法instance() 代替 new關鍵字來獲取該類的例項,達到全域性可見的效果。二是將構造方法設定成為private,如果使用new關鍵字建立類的例項,則編譯報錯,以防程式設計時候筆誤。

上面方法二的初始化方式稱為lazy initialization,是在第一次需要例項的時候才建立類的例項,與方法一中類的例項不管用不用一直都有相比,方法二更加節省系統資源。但是方法二在多執行緒應用中有時會出現多個例項化的現象。

假設這裡有2個執行緒:主線程和執行緒1,在建立類的例項的時候可能會遇到一些原因阻塞一段時間(比如網路速度或者需要等待某些正在使用的資源的釋放),此時的運**況如下:

主線程首先去呼叫instance()試圖獲得類的例項,instance()成員方法判斷該類沒有建立唯一例項,於是開始建立例項。由於一些因素,主線程不能馬上建立成功,而需要等待一些時間。此時執行緒1也去呼叫instance()試圖獲得該類的例項,因為此時例項還未被主線程成功建立,因此執行緒1又開始建立新例項。結果是兩個執行緒分別建立了兩次例項,對於計數器類來說,就會導致計數的值被重置,與singleton的初衷違背。解決這個問題的辦法是同步。

下面看看本文的計數器的例子的實現:

設計模式Singleton

設計模式singleton 引言 相信大多數拜讀過 gang of four erich gamma,richard helm,ralph johnson,john vlissides 的經典之作 design pattern 的同僚們,對這本書一定推崇有加。曾有人這麼宣告 只有在讀過 design...

設計模式 Singleton

關於singleton模式的理解與思考 1 singleton模式最常用的解決方案是什麼?2 singleton如何保證執行緒安全性?3 singleton物件的析構如何完成?singleton模式用來保證乙個程序中只有乙個某型別的實體,也就是說程序中的多執行緒可能共享該實體。共享該實體是指共享該實...

singleton設計模式

有很多情況需要只生成乙個物件,例如大家常用的任務管理器 這就需要單例設計模式了 不多說直接上 1.餓漢式 public class singleton 2.在內部生成物件,也要私有化 private static singleton instance new singleton 3.公共方法呼叫返回...