### 一、情人節的故事
2015年8月20日情人節這天,我親眼見了一場“瘋狂的戰斗”,里面的主人公是一位帥哥(這里暫且稱小A),我走在去學校的路上,途徑一個高檔餐廳,當我矗立在餐廳窗戶邊的時候,看到里面有一對情侶在里面一起吃飯甚是浪漫,突然黑色的烏云籠罩了天空,我順著烏云的方向透過明亮的窗戶,看到了三個美女一起將那對情侶保衛了起來,這個時候小A想要溜走,此時卻被三個美女一起抓住,只聽里面說到:“你不是沒時間和我過情人節嗎?這個人是誰?”,此時小A對面的美女站起來就說:“我是他女朋友,你們是誰啊?”,這時三位美女又說:“我是他好了兩年的女朋友,他一直說只有我一個人,怎么你就成了他女朋友了?”,后來血腥的場面就不給大家細說大家也知道了吧,最后四位美女一起關愛了小A一番都揚長而去了,此時我嘆息道:“小A啊,只怪你不懂得運用單例模式啊!雖然找幾個女朋友是你自己來決定,但是如果你找的超過一個之后,她們有一天見面了,后果...”
### 二、定義
要點:
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
###具體實現:
1.單例模式的類只提供私有的構造函數
2.類定義中含有一個該類的靜態私有對象
3.該類提供了一個靜態的公有的函數用于創建或獲取它本身的靜態私有對象
### 三、UML圖

### 四、C#代碼實例
###客戶端調用代碼
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;"> static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
//比較兩個實例化后對象的結果是相同實例
if (s1 == s2 )
{
Console.WriteLine("兩個對象是相同的實例");
}
Console.Read();
}</span>
~~~
###懶漢式
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;"> class Singleton
{
private static Singleton instance;
//構造方法讓其Private,這就堵死了外界利用new創建此類實例的可能
private Singleton()
{
}
//此方法是獲得本類實例的唯一全局訪問點
public static Singleton GetInstance()
{
//若實例不存在,則new一個新實例,否則返回已有的實例
if (instance == null )
{
instance = new Singleton();
}
}
}</span>
~~~
###餓漢式
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">class Singleton
{
private static Singleton instance = new Singleton();
//構造方法讓其Private,這就堵死了外界利用new創建此類實例的可能
private Singleton()
{
}
//此方法是獲得本類實例的唯一全局訪問點
public static Singleton GetInstance()
{
//上面已經實例化過了,所以這里直接返回就可以
return instance;
}
}</span>
~~~
###多線程
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;">class Singleton
{
private static Singleton instance;
//程序運行時創建一個靜態只讀的進程扶助對象
private static readonly object syncRoot = new object();
//構造方法讓其Private,這就堵死了外界利用new創建此類實例的可能
private Singleton()
{
}
//此方法是獲得本類實例的唯一全局訪問點
public static Singleton GetInstance()
{
//在同一個時刻加了鎖的那部分程序只有一個線程可以進入
lock (syncRoot)
{
//若實例不存在,則new一個新實例,否則返回已有的實例
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}</span>
~~~
###雙重鎖
~~~
<span style="font-family:KaiTi_GB2312;font-size:18px;"> class Singleton
{
private static Singleton instance;
//程序運行時創建一個靜態只讀的進程扶助對象
private static readonly object syncRoot = new object();
//構造方法讓其Private,這就堵死了外界利用new創建此類實例的可能
private Singleton()
{
}
//此方法是獲得本類實例的唯一全局訪問點
public static Singleton GetInstance()
{
//先判斷實例是否存在,不存在再加鎖處理
if (instance == null)
{
//在同一個時刻加了鎖的那部分程序只有一個線程可以進入
lock (syncRoot)
{
//若實例不存在,則new一個新實例,否則返回已有的實例
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}</span>
~~~
### 五、單例優缺點
優點:實例控制(單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例)、靈活(因為類控制了實例化過程,所以類可以靈活更改實例化過程、并且很多地方都不需要再進行實例化)
缺點:可以單擊此鏈接查看:[濫用的單例模式有多少害處](http://blog.csdn.net/slin000/article/details/3333724)
### 六、感受
再次學習單例模式之后對于它的理解、運用更加深入了,在以后的編程路上需要適度運用單例模式。