Singleton設計模式的C 實現 1

2021-03-31 08:56:59 字數 1928 閱讀 4721

1 singleton模式。

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

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

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

2 singleton的實現方式。

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

方法一:

using system;

namespace cspattern.singleton

static public singleton instance() }

} 方法二:

using system;

namespace cspattern.singleton

static public singleton instance()

return unisingleton;

} }

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

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

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

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

使用方法一:

using system;

using system.threading;

namespace cspattern.singleton

static public counter instance()

public void inc() //計數加1。

public int getcounter() //獲得當前計數值。

} }

以下是呼叫counter類的客戶程式,在這裡我們定義了四個執行緒同時使用計數器,每個執行緒使用4次,最後得到的正確結果應該是16:

using system;

using system.io;

using system.threading;

namespace cspattern.singleton.mutilethread

public void dosomework()

報告: 當前counter為: ", thread.currentthread.name.tostring(), mycounter.getcounter().tostring());

} }

public void clientmain() }

} (接下半部分)

c 設計模式 Singleton模式

參考的文件 單例要求乙個類裡面只有乙個例項,並且提供了乙個全域性的訪問點。單例類裡面定義了乙個getinstance的方法,是乙個靜態方法。用於建立自己的唯一例項。在乙個系統裡面要求某個類只有乙個例項才能使用單例模式。比如印表機 或者乙個通訊口進行傳輸。using system using syst...

C 設計模式之Singleton模式

singleton是二十三個設計模式中比較重要也比較經常使用的模式。但是這個模式雖然簡單,實現起來也會有一些小坑,讓我們一起來看看吧!首先我們看看這個設計模式的uml類圖。很清晰的可以看到,有三點是需要我們在實現這個模式的時候注意的地方。其中,私有化構造器是防止外部使用者建立新的例項而靜態方法用於返...

C 設計模式之Singleton

一 功能保證乙個類僅有乙個例項。二 結構圖 三 優缺點 singleton模式是做為 全域性變數 的替代品出現的。所以它具有全域性變數的特點 全域性可見 貫穿應用程式的整個生命期,它也具有全域性變數不具備的性質 同型別的物件例項只可能有乙個。四 實現 教科書上的singleton定義如下 class...