c#单例代码重用

pro*_*ach 4 c# singleton

我有很多类做不同的事情,但使用相同的单一模式来自http://www.yoda.arachsys.com/csharp/singleton.html

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;
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

例如,如果我有SingletonJob1和SingletonJob2我希望能够改变的代码中唯一的地方,如果我移动到其他辛格尔顿模式之一.

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

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我会敦促你考虑一下你是否真的需要那么多单身人士; 它们通常不适用于可测试性等.

编辑:如果你真的,真的想要懒惰并且你正在使用.NET 4,你可以使用单身页面新家的第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()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)