標籤:百度百科 資料庫連接 軟體設計 開發 書籍
一.原因
面試的過程中被問到設計模式的問題,所以我就先從簡單的設計模式開始談談。
二.介紹
從“單例”字面意思上理解為——一個類只有一個執行個體,所以單例模式也就是保證一個類只有一個執行個體的一種實現方法罷了(設計模式其實就是協助我們解決實際開發過程中的方法, 該方法是為了降低對象之間的耦合度,然而解決方案有很多種,所以前人就總結了一些常用的解決方案為書籍,從而把這本書就稱為設計模式),下面給出單例模式的一個百度百科的定義:單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體。即一個類只有一個對象執行個體。
三.單例模式的應用
在我們日常使用的在Windows中也有不少單例模式設計的組件,象常用的檔案管理工具。由於Windows作業系統是一個典型的多進程多線程系統,那麼在建立或者刪除某個檔案的時候,就不可避免地出現多個進程或線程同時操作一個檔案的現象。採用單例模式設計的檔案管理工具就可以完美的解決這個問題,所有的檔案操作都必須通過唯一的執行個體進行,這樣就不會產生混亂的現象。
再比如,每台電腦可以有若干個印表機,如果每一個進程或者線程都獨立地使用印表機資源的話,那麼我們列印出來的結果就有可能既包含這個列印任務的一部分,又包含另外一個列印任務的一部分。所以,大多數的作業系統最終為列印任務設計了一個單例模式的假離線服務Printer Spooler,所有的列印任務都需要通過假離線服務進行。
實際上,配置資訊類、管理類、控制類、門面類、代理類通常被設計為單例類。像Java的Struts、spring架構,.Net的Spring.NET架構,以及PHP的Zend架構都大量使用了單例模式。
四.執行個體
第一種最簡單,但沒有考慮安全執行緒,在多線程時可能會出問題,
public class Singleton{ private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; }}
第二種考慮了安全執行緒,不過有點煩,但絕對是正規寫法,經典的一叉
public class Singleton
{
private volatile static Singleton _instance = null;
private static readonly object lockHelper = new object();
private Singleton(){}
public static Singleton CreateInstance()
{
if(_instance == null)
{
lock(lockHelper)
{
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
第三種可能是C#這樣的進階語言特有的,實在懶得出奇
public class Singleton{ private Singleton(){} public static readonly Singleton instance = new Singleton();}
使用Singleton模式有一個必要條件:在一個系統要求一個類只有一個執行個體時才應當使用單例模式。反過來,如果一個類可以有幾個執行個體共存,就不要使用單例模式。
注意:
不要使用單例模式存取全域變數。這違背了單例模式的用意,最好放到對應類的靜態成員中。
不要將資料庫連接做成單例,因為一個系統可能會與資料庫有多個串連,並且在有串連池的情況下,應當儘可能及時釋放串連。Singleton模式由於使用靜態成員儲存類執行個體,所以可能會造成資源無法及時釋放,帶來問題。
本文出自 “11929767” 部落格,請務必保留此出處http://11939767.blog.51cto.com/11929767/1918252
c#設計模式-單例模式