C#面向對象設計模式縱橫談——2.Singleton 單件(建立型模式)

一:模式分類設計模式

從目的來看:多線程

建立型(Creational)模式:負責對象建立。框架

結構型(Structural)模式:處理類與對象間的組合。優化

行爲型(Behavioral)模式:類與對象交互中的職責分配。spa

 

從範圍來看:線程

類模式處理類與子類的靜態關係。設計

對象模式處理對象間的動態關係。code

 

二:Singleton (建立型模式) 單件對象

1.動機(Motivationblog

軟件系統中,常常有這樣一些特殊的類,必須保證他們在系統中只存在一個實例,才能確保它們的邏輯正確性,以及良好的效率。

如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例 ?

這應該是類設計者的責任,而不是使用者的責任。

 

2.意圖(Intent

保證一個類僅有一個實例,並提供一個該實例的全局訪問點。   ——《設計模式》 GOF

 

3.結構(Structure

 

 

 

三:實現

 

1.單線程Singleton模式實現

 

1.2單線程Singleton幾個要點:

Singleton模式中的實例構造器能夠設置爲protected以容許子類派生。

Singleton模式通常不要支持Icloneable接口,由於這可能致使多個實例對象,與Singleton模式初衷違背。

Singleton模式通常不要支持序列化,由於這可能致使多個實例對象,與Singleton模式初衷違背。

Singleton模式只考慮對象建立的管理,沒有考慮對象銷燬的管理,就支持垃圾回收的平臺和對象的開銷來說,咱們沒有必要對其銷燬進行管理特殊管理。

不能應對多線程狀況,在多線程環境下仍有可能出現多個對象實例。

 

 public class MySigleton_SingleProcess
    {
        private static MySigleton_SingleProcess instance;

        private MySigleton_SingleProcess() { }

        public static MySigleton_SingleProcess GetMySingletonInstance()
        { 
            if(instance==null){
                instance = new MySigleton_SingleProcess();
            }
            return instance;
        }
    }

  

2.多線程Singleton模式實現

 

 

    public class MySigleton_MultiProcess
    {
        private static MySigleton_MultiProcess instance;

        private static readonly object lockHelper=new object();

        private MySigleton_MultiProcess() { }

        public static MySigleton_MultiProcess GetMySingletonInstance()
        {
            if (instance == null)
            {
                lock (lockHelper)
                {
                    //double check 預防代碼編譯的時候做出優化調整了代碼執行順序
                    if (instance == null)
                    {
                        instance = new MySigleton_MultiProcess();
                    }
                }
               
            }
            return instance;
        }
    }

 

 

3.使用.NET初始化機制實現多線程Singleton模式

 

  public  class Singleton
    {
        private static readonly Singleton _instance = new Singleton();

        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Singleton()
        {
        }

        /// <summary>
        /// Prevents a default instance of the 
        /// <see cref="Singleton"/> class from being created.
        /// </summary>
        private Singleton()
        {
        }

        /// <summary>
        /// Gets the instance.
        /// </summary>
        public static Singleton Instance
        {
            get
            {
                return _instance;
            }
        }
    }

 

4.Singleton 模式擴展

 

 將一個實例擴展到多個實例,好比對象池的實現。

New構造器的調用轉移到其餘類中,例如多個類協同工做環境中,某個局部環境只須要擁有某個類的一個實例。

Singleton 模式核心是「如何控制用戶使用new對一個類的實例構造器的任意調用」。

 

5. .NET框架中Singleton模式的應用

Object 基類中的 GetType() 。

相關文章
相關標籤/搜索