Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 不同的singelton实现_Design Patterns_Singleton - Fatal编程技术网

Design patterns 不同的singelton实现

Design patterns 不同的singelton实现,design-patterns,singleton,Design Patterns,Singleton,当我被介绍到singleton模式时,这是实现它的方法: public class MySingleton { private MyStingleton instance; private MySingleton() { //constructor } public static MySingleton GetInstance() { if(instance== null) {

当我被介绍到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
    }

}

第一个示例不是线程安全的。您可以看看。

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

您可能应该查看以下链接:其中列出了许多单例实现,并解释了每种实现的优缺点

最后一个正确的单例是:

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();
    }
}

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

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


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

如何“避免全局数据、不稳定的设计、隐藏的依赖项,以及将应用程序中的每个类耦合到单个实例”?请注意,文章顶部有一个链接,指向文章的更新版本,还有一个使用
Lazy
的额外模式。嘿,Jon,我自己也错过了这个链接,这是.NET4.0中非常好的功能。通过回答问题了解更多信息总是很有趣:)@Petar啊,可能是的,可能我把它和instance=null混淆了,而不是instance=new(..),这是不安全的。