2017-05-28 67 views
2

我是新来设计C#模式。任何人都可以给我一些关于Singleton类的实现的说明。我刚刚实现了一个教程,但我无法理解单例类的使用,这个“单例表示我们只能创建一个类的一个实例”。那么为什么我们不使用两个不同类的实例访问单例类中写入的属性。单个类的两个实例是否具有相同的属性值?

请看我的代码,并给我说明我犯的错误。

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;} 
} 
+5

如果有两个实例,它不是一个单例。 –

+2

,因为这个getInstance **总是**返回一个**新的**实例 –

回答

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

它与线程safity和延迟初始化没有问题。

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

+0

请问你可以描述它是如何安全的线程? – Jagdish

+0

@Jagdish由设计懒惰 .Value实现为线程安全。阅读更多:https://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx – Backs

+0

好吧,我完全理解谢谢@Backs。但如果你不介意,我可以问你另一个问题吗?我们如何才能打破第一个单线程类的多线程 – Jagdish

4

你的单例执行是不正确的。
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; 
} 

注意,如果在并行多次调用这不是线程安全的。

作为一种资源,我可以推荐乔恩斯基特的帖子:
http://csharpindepth.com/Articles/General/Singleton.aspx

他explaines六种不同的解决方案(包括线程安全和懒惰(T)),以Singleton模式以及如何将它们编码。

1

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

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

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

没有两个实例,singleton类总是有一个没有或一个实例。

在代码中,单变量和singleton1变量指向两个相同的对象,单身,而原因是因为该方法的getInstance()的实施,很容易理解:

如果方法被第一次调用,然后它为独特的时间创建新方法的单例对象。

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

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

相关问题