不同的singelton实现

时间:2011-04-02 06:51:23

标签: design-patterns singleton

当我介绍单例模式时,这就是实现它的方法:

public class MySingleton
{
    private MyStingleton instance;

    private MySingleton()
    {
        //constructor
    }

    public static MySingleton GetInstance()
    {
        if(instance== null)
        {
            instance = new MySingleton();    
        }
        return instance;
    }
}

与此相比,这样做有什么好处:

public class MySingleton
{
    public static readonly MyStingleton Instance = new MySingleton();

    private MySingleton()
    {
        //constructor
    }

}

3 个答案:

答案 0 :(得分:4)

第一个例子不是线程安全的。您可以查看following article

答案 1 :(得分:2)

这两个单例实现都是不安全的,我认为使用第二个实现第一个没有任何好处。

你应该查看这个链接:http://www.yoda.arachsys.com/csharp/singleton.html列出了许多单例实现,每个实现都解释了为什么它们好或坏。

最终正确的单身是:

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

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

        internal static readonly Singleton instance = new Singleton();
    }
}

答案 2 :(得分:2)

在第一个实例中,在调用GetInstance静态方法之前,不会创建实例。在调用此方法时创建实例。

在第二个例子中,实例是一个常数,在概念上是不同的。

用于使用第一个,是我一直看到的模式,你可以控制创建实例的时间。