8

用 C# 实现的单例可能是这样的:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

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

如果我使用静态来实现它,例如:

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

这样,app 也应该只获取整个应用程序的一个实例。那么这两种方法有什么区别呢?为什么不直接使用静态成员(更简单直接)?

4

2 回答 2

9

如果您使用第二种方法:

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

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

于 2012-10-01T17:50:32.953 回答
-1

以下是 static 和 Singleton 之间的一些区别:

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

更多静态与单例

于 2012-10-01T17:58:04.977 回答