c#单例代码重用

时间:2011-03-03 11:06:06

标签: c# singleton

我有很多类在做同样的事情但使用http://www.yoda.arachsys.com/csharp/singleton.html

中的相同Singleton模式
public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock = new object();

Singleton()
{
}

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

有没有人有一个简洁的方法我可以在不同的类之间尽可能多地重用常见的Singleton代码?

例如,如果我有SingletonJob1和SingletonJob2,我希望能够仅在我移动到其他Singleton模式之一的地方更改代码。

编辑:是的,因为人们已经指出http://www.yoda.arachsys.com/csharp/singleton.html中的方法5代码较少。我读到了页面的末尾!我选择了方法2,因为Singleton对象与硬件设备有关,我只希望在程序的任何给定运行中初始化和使用它们。方法5将立即初始化它们。

5 个答案:

答案 0 :(得分:5)

您是否有任何理由使用该版本而不是仅仅在声明中初始化实例的简单版本?

public class Singleton
{
    private static Singleton instance = new Singleton();
    public static Singleton Instance { get { return instance; } }

    // Only use this if you really need it - see the page for details
    static Singleton() {}

    private Singleton()
    {
        // I assume this logic varies
    }
}

这种模式足够短,我认为将它包含在任何地方并不是一个大问题。

我会劝你考虑你是否真的需要许多单身人士;它们通常对可测试性等不太好。

编辑:如果你真的,真的想要懒惰并且你正在使用.NET 4,你可以使用the singleton page's new home上的第6个模式获得它:

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

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

    private Singleton()
    {
    }
}

答案 1 :(得分:3)

public static class Singleton<T>  where T: new()
{

static T instance=null;
static readonly object padlock = new object();

public static T Instance
{
    get
    {
        lock (padlock)
        {
            if (instance==null)
            {
                instance = new T();
            }
            return instance;
        }
    }
}

}

所以你可以在所有类中使用Singleton:

Singleton<YourClass>.Instance.YourMethod();

答案 2 :(得分:2)

答案 3 :(得分:2)

这样的东西?

public sealed class Singleton<T>
{
static T instance=null;
static readonly object padlock = new object();
static Func<T> createInstance;

Singleton(Func<T> constructor)
{
   createInstance = constructor;
}

public static T Instance
{
    get
    {
        lock (padlock)
        {
            if (instance==null)
            {
                instance = createInstance();
            }
            return instance;
        }
    }
}
}

答案 4 :(得分:1)

我相信这就是你所追求的。然而,我强烈建议避免使用这种Singleton(大写字母S)模式,因为它会破坏所有单元测试灵魂并使大量事物难以控制。

public class Singleton<T> where T : new()
{
  private static T _Instance;
  private static readonly object _InstanceLock = new object();

  public static T Instance
  {
    get
    {
      if (_Instance == null)
      {
        lock (_InstanceLock)
        {
          if (_Instance == null)
          {
            _Instance = new T();
          }
        }
      }
      return _Instance;
    }
  }

}

public class Foo : Singleton<Foo>
{
  public void Something()
  {
  }
}

public class Example
{
  public static void Main()
  {
    Foo.Instance.Something();
  }
}