單例項模式(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...