静态属性和单例之间有什么区别?

时间:2012-10-01 17:47:21

标签: c# design-patterns

使用C#实现的Singleton可以是:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

如果我使用static来实现它:

public static class Globals{
  public static Singleton Instance = new Singleton();
}

通过这种方式,app也应该只获得整个应用程序的一个实例。 那么这两种方法之间的区别是什么?为什么不直接使用静态成员(更简单直接)?

2 个答案:

答案 0 :(得分:8)

如果您使用第二种方法:

public static class Globals{
  public static Singleton Instance = new Singleton();
}

没有什么能阻止某人做的事情:

Singleton anotherInstance = new Singleton(); // Violates singleton rules

您还没有获得第一个版本(尝试)实现的相同的延迟初始化,以及您使用的公共字段,如果将来不提供相同的灵活性,你需要改变获取值时发生的事情。

请注意,.NET 4提供了一种更好的制作单例的方法:

public class Singleton
{
   private static readonly Lazy<Singleton> instance = new Lazy<Singleton>( ()=> new Singleton());

   private Singleton() {}

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

这很好,因为它完全是懒惰的完全线程安全,但也很简单。

答案 1 :(得分:-1)

以下是静态和单身之间的一些区别:

  1. Singleton是一种模式,而static是一个关键字。
  2. Singleton类可以有静态和非静态方法,但静态类只能有静态成员和方法。
  3. 我们可以在Singleton类中实现接口,但在静态类中我们无法实现接口。
  4. 我们可以扩展Singleton类,而我们不能扩展静态类,即Singleton类可以从任何类型的类派生。
  5. 了解更多static vs Singleton