Singleton模式,寫法整理。

 

第二版:簡單的線程安全

public sealed class Singleton
{
    private static Singleton instance = null ;
    private static readonly object padlock = new object() ;
    Singleton()
    {
    }
    public static Singleton Instance
    {
        get
        {
            lock ( padlock )
            {
                if ( instance == null )
                {
                    instance = new Singleton() ;
                }
                return instance ;
            }
        }
    }
}

第四版:不是Lazy方式,但線程安全又不需要Lock

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton() ;
    // Explicit static constructor to tell C# compiler
    // not to mark type as before field init
    static Singleton()
    {
    }
    private Singleton()
    {
    }
    public static Singleton Instance
    {
        get
        {
            return instance ;
        }
    }
}

第五版:完全Lazy實例

public sealed class Singleton
{
    private Singleton()
    {
    }
    public static Singleton Instance { get { return Nested.instance; } }
    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as before field init
        static Nested()
        {
        }
        internal static readonly Singleton instance = new Singleton() ;
    }
}

第六版:使用 .NET 4 的 Lazy<T> 型別

// using System.Lazy<T>
public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>( () => new Singleton() ) ;
    public static Singleton Instance { get { return lazy.Value ; } }
    private Singleton()
    {
    }
}

 

參考資料:
http://weiyiao.pixnet.net/blog/post/30971305-%5Bc%...
http://csharpindepth.com/Articles/General/Singleto...
https://msdn.microsoft.com/en-us/library/ff650316....

 

arrow
arrow

    Robert 發表在 痞客邦 留言(0) 人氣()