这是Singleton Pattern的真正实现吗?

时间:2012-06-06 15:05:25

标签: asp.net design-patterns singleton

我读到的关于Singleton模式的所有教程如下:

 public sealed class Singleton
 {
      private static readonly Singleton instance = new Singleton();

      private Singleton(){}

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

但是我已经在程序集中有一个类,我需要在应用程序生命周期中只有一个它的实例。我不知道如何使用上面提到的模式。

例如,假设在名为Y的dll中有一个类X.下面的代码是正确的:

 public sealed class Singleton
 {
      private static readonly Y.X instance = new Y.X();

      private Singleton(){}

      public static Y.X Instance
      {
         get 
         {
            return instance; 
         }
      }
 }

这是一个真正的单身人士吗?如果没有,处理这种情况的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我会使用类似的东西:

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

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

我们的想法是使用Generics以允许将任何类型指定为类型参数。

懒惰只是对实例化对象的实际实例的一种改进。

请注意,这不会禁止直接创建T的实例......

答案 1 :(得分:1)

不是它不是单身人士模式。您正在调用新的Y.X()这意味着任何人都可以调用它。这并不特别禁止Y.X()

的新实例

但是,如果您需要确保在应用程序中仅引用Y.X的一个实例,则代码是可以的。然后你可以通过调用Singleton.Instance来获得它。

这实际上是Factory模式(一个专门用于创建对象的类),我建议你调用类XFactory或类似的东西,而不是单例。