我有很多类做不同的事情,但使用相同的单一模式来自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将立即初始化它们.
您是否有任何理由使用该版本而不是简单的初始化声明中的实例?
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)