模式分類:多線程
從目的來看:函數
1)建立型(Creational)模式;負責對象建立spa
2)結構型(Structural)模式;處理類與對象間的組合線程
3)行爲型(Behavioral)模式;類與對象交互中的職責分配設計
從範圍來看:code
1)類模式處理類與子類的靜態關係對象
2)對象模式處理對象間的動態關係blog
動機(Motivation):接口
在軟件系統中,常常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。get
如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?
這應該是類設計者的責任,而不是使用者的責任。
意圖(Intent):
保證一個類僅有一個實例,並提供一個該實例的全局訪問點。
單線程單件模式代碼示例:
///
<summary>
///
單線程單例模式示例
///
</summary>
public
class Singleton
{
///
<summary>
///
靜態的對象實例
///
</summary>
private
static Singleton instance;
///
<summary>
///
私有的構造函數
///
</summary>
private Singleton()
{
}
///
<summary>
///
獲取對象實例的惟一入口
///
</summary>
public
static Singleton GetInstance
{
get
{
if(
null == instance)
instance =
new Singleton();
return instance;
}
}
}
單線程Singleton模式的幾個要點:
1)Singleton模式中的實例構造器能夠設置爲Protected以容許子類派生。
2)Singleton模式通常不要支持ICloneable接口,由於這可能會致使多個對象實例,與Singleton模式的初衷違背。
3)Singleton模式通常不支持序列化,由於這也有可能致使多個對象實例,一樣與Singleton模式的初衷違背。
4)Singleton模式只考慮到了對象建立的管理,沒有考慮對象銷燬的管理。就支持垃圾回收的平臺和對象的開銷來說,咱們通常沒有必要對其銷燬進行特殊的管理。
5)不能就對多線程環境:在多線程環境下,使用Singleton模式依然有可能獲得Singleton類的多個實例對象。
///
<summary>
///
多線程餓漢式單例模式示例
///
</summary>
public
class Singleton
{
///
<summary>
///
靜態的對象實例,在類聲明時就對該對象進行實例化
///
</summary>
private
static
readonly Singleton instance =
new Singleton();
///
<summary>
///
私有的構造函數
///
</summary>
private Singleton()
{
}
///
<summary>
///
獲取對象實例的惟一入口
///
</summary>
public
static Singleton GetInstance
{
get
{
lock(instance)
{
return instance;
}
}
}
}
///
<summary>
///
多線程懶漢式單例模式示例
///
</summary>
public
class Singleton
{
///
<summary>
///
靜態的對象實例
///
</summary>
private
static
volatile Singleton instance;
///
<summary>
///
同步鎖
///
</summary>
private
static
object lockObject =
new
object();
///
<summary>
///
私有的構造函數
///
</summary>
private Singleton()
{
}
///
<summary>
///
獲取對象實例的惟一入口
///
</summary>
public
static Singleton GetInstance
{
get
{
if(
null == instance)
{
lock(instance)
{
if(
null == instance)
{
instance =
new Singleton();
}
}
}
return instance;
}
}
}
///
<summary>
///
多線程餓漢式單例模式示例(簡)
///
</summary>
public
class Singleton
{
public
static
readonly Singleton instance =
new Singleton();
private Singleton()
{
}
}
Singleton模式擴展:
1)將一個實例擴展到N個實例,例如對象池的實現。
2)將new構造器的調用轉移到其餘類中,例如多個類協同工做環境中,某個局部環境只須要擁有某個類的一個實例。
3)理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的實例構造器的任意調用」。