c#单例代码重用

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

有没有人有一个巧妙的方法可以在不同的类之间重用尽可能多的通用单例代码?

例如,如果我有 SingletonJob1 和 SingletonJob2,我希望只有在我移动到其他 Singleton 模式之一时才能更改代码。

编辑:是的,正如人们从 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
    }
}

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

我建议您考虑一下您是否真的需要那么多单例;它们通常不利于可测试性等。

编辑:如果您真的非常想要懒惰并且您使用的是 .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()
    {
    }
}

关于c#单例代码重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179893/

相关文章:

java - 缓存 javax.sql.Datasource 对象的单个实例是个好主意吗?

java - 单例返回多个实例

c# - 如何识别安装程序文件?

c# - TextBlock 重写样式的奇怪行为

c# - 无法从存储过程中获取返回值

c# - 如何使 Windows Phone 应用程序像默认应用程序一样加载得更快?

c# - 单例 - 我可以创建多个实例

java - 如何在Java包中查找实例变量的所有初始化?

c# - WPF:如何在按钮上居中和缩放字符?

java - 如何从另一个类的数组中打印特定行