单例类的两个实例是否具有相同的属性值?

时间:2017-05-28 08:03:48

标签: c# singleton

我是C#中设计模式的新手。任何人都可以给我一些关于Singleton类的实现的说明。我刚刚实现了一个教程,但是我无法理解单例类的使用和#34;单例意味着我们只能创建一个类的一个实例"。那么为什么我们不使用两个不同的类实例来访问在单例类中编写的属性。

请查看我的代码并告诉我有关我犯的错误。

static void Main(string[] args)
{

     Singleton instance = Singleton.getInstance();
     instance.Message = "Text Message";

     Singleton instance1 = Singleton.getInstance();
     Console.WriteLine(instance.Message);
     Console.WriteLine(instance1.Message);
     Console.ReadKey();
}

class Singleton
{
    private static Singleton singleton=null;
    private Singleton(){}
    public static Singleton getInstance()
    {
        if (singleton!=null)
        {
            return singleton;
        }
        return new Singleton();
    }
    public string Message{get; set;}
}

3 个答案:

答案 0 :(得分:4)

你的单身人士不正确。 更正确的版本:

class Singleton
{
    private static Singleton singleton = null;
    private Singleton(){}
    public static Singleton getInstance()
    {
        if (singleton!=null)
        {
            return singleton;
        }
        return (singleton = new Singleton()); //here is
    }
    public string Message{get; set;}
}

非常好的解决方案:

class Singleton
{
    private static Lazy<Singleton> singleton = new Lazy<Singleton>(()=> new Singleton());
    private Singleton() { }
    public static Singleton getInstance()
    {
        return singleton.Value;
    }
    public string Message { get; set; }
}

线程安全性和延迟初始化没有问题。

  

默认情况下,Lazy类的所有公共成员和受保护成员都是   线程安全,可以从多个线程同时使用。这些   线程安全保证可以选择性地和每个实例删除,   使用参数类型的构造函数。

答案 1 :(得分:4)

您的Singleton实施不正确。
Singleton旨在始终只允许任何一个或单个实例 这是你出错的地方:

public static Singleton getInstance()
{
   // "singleton" will always be null.
   if (singleton != null)
   {
      return singleton;
   }

   // Always returns new instance rather than existing one.
   return new Singleton();
}

要修复它,你应该写:

public static Singleton getInstance()
{
   // Return the instance we might have stored earlier.
   if (singleton != null)
      return singleton;

   // Now we store the only instance that will ever be created.
   singleton = new Singleton();
   return singleton;
}

请注意,如果多次并行调用,则这不是线程安全的
作为资源,我可以推荐Jon Skeet的帖子:
http://csharpindepth.com/Articles/General/Singleton.aspx

他向Singleton模式解释了六种不同的解决方案(包括线程安全和Lazy(T))以及如何对它们进行编码。

答案 2 :(得分:1)

单例类的两个实例是否具有相同的属性值?

您的问题的答案是肯定的,它们具有相同的属性值。 重要的是理解为什么,原因是单身人士的核心。那么,为什么?:

因为您将两个引用混淆为两个实例。

没有两个实例,总是只有一个或一个单例类的实例。

在你的代码中,singleton变量和singleton1变量都指向同一个对象,singleton,原因是因为方法getInstance()的实现,很容易理解:

如果第一次调用method,那么它会使用new方法为singleton对象创建唯一的时间。

如果第一次调用method后,它将返回第一次调用方法时创建的单例对象。

因此,无论您使用的Singleton类型有多少变量,您始终只能使用新方法,实例,单例实例创建一个Singleton。