單例項模式 Singleton

2021-04-03 01:31:56 字數 1622 閱讀 5928

單例項模式(singleton)

最近乙個人好無聊想寫點東西,正好剛學了點設計模式,覺得singleton這個詞最能引起我的共鳴:( 。single乙個人,ton好多人,『街道上人潮襯托我的孤單,想象,誰幸運陪在你身旁,卻誤會一場,你也在等你手機響』。暈了, 閒話少說,步入正題。

建立singleton模式的目的是:『ensure a class has only one instance, and provide a global point of access to it』. 使用乙個全域性的靜態變數只能解決global access的問題,當然你也不能期望這個類的使用者會保證only one instance。所以我們需要控制類例項的建立,並且保證任何時候只有乙個例項存在。 下面是c++版本的singleton:

// declaration

class singleton

// implementation

singleton* singleton::_instance = 0;

singleton* singleton::instance()

return _instance;}

上面的**看起來管用,但在多執行緒環境下會有潛在的危險。如果有兩個執行緒同時進入if語句塊,兩個例項會被建立。可以使用臨界區限制同時訪問,但是那樣會對效能帶來不好的影響。

先看下面的**:(c#)

class singleton }}

return _instance;     

}protected singleton() {}

private static volatile singleton _instance = null;

}上面使用了"double-check"解決了使用臨界區對效能的影響,同時又保證了only one instance.注意使用了volatile關鍵字保證編譯器不做優化.

上面的**還是冗長, 既然用.net, 我們可以充分利用.net給我們帶來的方便:

// .net singleton 
sealed class singleton 
 
public static readonly singleton instance = new singleton(); 
}
大家可能會懷疑這還是singleton嗎? 先看乙個例子:
using system;
/// 

/// sample singleton class

///

sealed class singletoncounter

public long nextvalue()

}

class singletonclient

",singletoncounter.instance.nextvalue());}}

}

在vs2005中新建乙個c# console專案貼上上面的**,ctrl+f5,一切ok. 下面解釋一下,首先是only one instance,
.net 在jit階段, 靜態變數只有在使用時才被例項化, 關於執行緒安全,.net framework保證了靜態變數初始化安全.

Singleton 單例項 模式

在某些情況下 特定型別的資料需要提供給應用程式中的其他所有物件使用。在大多數情況下,這種型別的資料在系統中還是唯一的。如何使物件例項全域性可用,並保證僅建立乙個此類的例項?singleton 通過下列方法提供唯一的全域性例項 1.讓類建立自己的唯一例項。2.允許其他物件通過可返回例項引用的類方法來訪...

單例項Singleton設計模式

單例項singleton設計模式 這個設計模式主要目的是想在整個系統中只能出現乙個類的例項。這樣做當然是有必然的,比如你的軟體的全域性配置資訊,或者是乙個factory,或是乙個主控類,等等。你希望這 個類在整個系統中只能出現乙個例項。singleton的版本1.0 public class sin...

設計模式之單例項模式 Singleton

原理 將類的建構函式由pubic變為private或者protect,新增獲取物件的public 成員函式,返回指向物件的靜態指標。首先來一段簡單的 實現 一class singleton return pinstance protected singleton private static sin...