1. 程式人生 > >面向對象編程思想-單例模式

面向對象編程思想-單例模式

構造 turn 什麽 性能 線程池 線程並發 管理器 成員 man

單例模式的定義:只能有一個實例,提供唯一公開、可訪問實例的全局訪問點

單例模式的三種實現方式:

示例1

     private Singleton()
        {
            Console.WriteLine("{0}被構造,線程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }
private static Singleton m_Singleton = null;public static Singleton CreateInstance() {
if (m_Singleton == null) {
          //Thread.Sleep(1000); m_Singleton
= new Singleton(); } return m_Singleton; }

優點:直到對象要求產生一個實例才執行實例化

缺點:線程不安全,並發執行時,如果尚未創建實例,會創建多個實例

示例2

        private Singleton()
        {
            Console.WriteLine(
"{0}被構造,線程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); } private static readonly Singleton m_Singleton = new Singleton(); public static Singleton CreateInstance() { return m_Singleton; }

優點:線程安全

缺點:靜態初始化由CLR執行,缺少實例化機制的控制權 。在程序啟動或第一次訪問引用了類的任何成員時實例已經被創建。

示例3

        private Singleton()
        {
            Console.WriteLine("{0}被構造,線程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }

        private static Singleton m_Singleton = null;

        private static readonly object m_Object = new object();

        public static Singleton CreateInstance()
        {
       //提高系統性能。鎖會阻塞線程,對象被實例化後不再需要線程排隊等待
if (m_Singleton == null) {
          //保證鎖住部分只有一個線程執行
lock (m_Object) {
            //確保單線程時 對象只被創建一次
if (m_Singleton == null) { m_Singleton = new Singleton(); } } } return m_Singleton; }

優點:解決線程並發問題,將實例化延遲到第一次訪問對象時發生

使用場景:系統的任務管理器,配置文件的讀取,數據庫連接池的設計,多線程的線程池設計,應用程序的日誌應用等。

說到這裏有人會問:

1.有了靜態類,為什麽還要有“單例”?

靜態類是一種語法,而單例模式是一種思想。

靜態類不可以繼承類或實現接口。

靜態類中不能聲明實例成員。即靜態類中所有的字段,屬性,方法等都必須是靜態的。

無法控制靜態成員的初始化。 

設計模式是前人不斷嘗試、改進後提煉出來的思想。但我們不要生搬硬套,適合的才是最好的。在此,關於單例模式的學習到此結束。謝謝您的閱讀

由於博主能力有限,文中可能存在不正確的地方,歡迎斧正,補充。        

面向對象編程思想-單例模式