單例模式是一種比較常見的設計模式,比如symbian中的App,可以作為一個共享存儲變量的類供所有view使用,避免使用全局變量,其主要作用有:
第一、控制資源的使用,通過線程同步來控制資源的並發訪問,以防同一時間modify資源而造成數據不統一等內容;
第二、控制實例產生的數量,達到節約資源的目的。
第三、作為通信媒介使用,也就是數據共享,它可以在不建立直接關聯的條件下,讓多個不相關的兩個線程或者進程之間實現通信。
數據庫連接池的設計一般采用單例模式,數據庫連接是一種數據庫資源。通過遍歷數據庫連接池來獲得數據庫連接對象,如果有那么就可以省去連接數據庫的操作而浪費掉的時間。軟件系統中使用數據庫連接池,主要是節省打開或者關閉數據庫連接所引起的效率損耗,這種效率上的損耗還是非常昂貴的。當然,使用數據庫連接池還有很多其它的好處,可以屏蔽不同數據數據庫之間的差異,實現系統對數據庫的低度耦合,也可以被多個系統同時使用,具有高可復用性,還能方便對數據庫連接的管理等等。數據庫連接池屬於重量級資源,一個應用中只需要保留一份即可,既節省了資源又方便管理。所以數據庫連接池采用單例模式進行設計會是一個非常好的選擇。
在我們日常使用的在Windows中也有不少單例模式設計的組件,象常用的文件管理器。由於Windows操作系統是一個典型的多進程多線程系統,那么在創建或者刪除某個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象。采用單例模式設計的文件管理器就可以完美的解決這個問題,所有的文件操作都必須通過唯一的實例進行,這樣就不會產生混亂的現象。
再比如,每台計算機可以有若干個打印機,如果每一個進程或者線程都獨立地使用打印機資源的話,那么我們打印出來的結果就有可能既包含這個打印任務的一部分,又包含另外一個打印任務的一部分。所以,大多數的操作系統最終為打印任務設計了一個單例模式的假脫機服務Printer Spooler,所有的打印任務都需要通過假脫機服務進行。
實際上,配置信息類、管理類、控制類、門面類、代理類通常被設計為單例類。像Java的Struts、Spring框架,.Net的Spring.Net框架,以及Php的Zend框架都大量使用了單例模式。
單例模式需要注意的問題:
1.lock,單例模式在多線程訪問的時候還是有可能出現實例化多個對象的情況,此時需要實現lock對象的操作,這樣在一個線程進入判斷單例是否實例化的時候如果有另外一個線程也要訪問,那么必須等待到第一個線程釋放對象資源,才可以進入,而又沒有必要每次都要鎖定對象,那么使用雙重鎖定來實現單例模式。(這個過程中有關單例的死鎖,我一直沒弄明白,現在自己就了解鎖定多個資源的時候,多線程如果加鎖和釋放的順序不一樣的話,會造成循環等待資源釋放,造成死鎖,有了解單例死鎖的請勞煩跟小弟講一下)
2.懶漢initialize instance和餓漢式實例化單例對象,兩種initialize都可以,不過餓漢式是在加載類的時候就進行初始化實例,而懶漢是在get instance的時候才會對實例進行initialize。
單例模式實現存儲資源配置文件信息:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPattern { class SingletonPattern { private string dataname; private string datapwd; public string Dataname { get { return dataname; } set { dataname = value; } } public string Datapwd { get { return datapwd; } set { datapwd = value; } } private SingletonPattern() { } private static readonly object aObject = new object(); private static SingletonPattern aSingle; public static SingletonPattern GetSingleton() { if(aSingle == null) lock (aObject) { if (aSingle == null) { aSingle = new SingletonPattern(); aSingle.Dataname = System.Configuration.ConfigurationSettings.AppSettings["dataname"].ToString(); aSingle.Datapwd = System.Configuration.ConfigurationSettings.AppSettings["datapwd"].ToString(); } } return aSingle; } } class Program { static void Main(string[] args) { Console.WriteLine("dataname:" + SingletonPattern.GetSingleton().Dataname); Console.WriteLine("datapwd:" + SingletonPattern.GetSingleton().Datapwd); Console.ReadKey(); } } }
初涉設計模式,請大家多多指正錯誤和不足。。。。
轉載請注明出處:Edward_jie,http://www.cnblogs.com/promise-7/archive/2012/05/22/2513302.html
