如何管理Singleton实例?

时间:2010-02-17 08:56:12

标签: c# singleton

这是:What is a singleton in C#?

的副本

我不认为它是重复的,因为我在寻找的是在不使用时释放/处理Singleto对象的最佳策略。

如何实现Singleton,以便在不使用所有引用时释放/处置对象实例?当任何身体想要一个Singleton实例时,它会根据需要延迟加载。

4 个答案:

答案 0 :(得分:7)

单身人士不应动态处置:一旦创建,它们就会存在,直到应用程序的生命周期结束。 Singleton意味着只有一个实例。

即使您的Singleton保留了您想要动态释放和重新保留的资源,也不应该销毁并重新创建Singleton实例。这与模式的常见含义和用法相矛盾,模式可能(最多)导致团队中的沟通问题,或者(最坏的情况下)应用程序中的微妙错误。

相反,您可以让Singleton对象在内部管理该资源:如果它已经使用了一段时间,或者如果它的引用计数降为0,则释放它。

您还应该考虑使用Factory来访问该资源。这使您可以更自由地控制相关资源的处理。您还可以在内部重复使用创建的对象,实际上将对象计数保持在最多1。

答案 1 :(得分:4)

正如其他一些答案所说,Implementing the Singleton Pattern in C#是单身人士最好的资源之一。

如果你希望你的单身人士在其他任何地方都没有被引用时被释放,你可以从上述网站中取出你最喜欢的模式并将实例包装成WeakReference,例如:

public sealed class Singleton
{
    static private readonly WeakReference _instanceReference =
        new WeakReference(Singleton.LoadInstance());
    static public Singleton Instance
    {
        get { return Singleton.GetInstance(); }
    }

    static private Singleton() { }

    static private Singleton LoadInstance()
    {
        // load from expensive resource;
        return new Singleton();
    }

    static private Singleton GetInstance()
    {
        Singleton result = _instanceReference.Target as Singleton;
        if (result == null)
        {
            // TODO: consider thread safety
            result = LoadInstance();
            _instanceReference.Target = result;
        }

        return result;
    }

    private Singleton()
    {
        //
    }

}

请注意,消费者很可能只会调用您的Singleton.Instance并且不会自己创建引用,这意味着您的资源会经常重新加载。我想如果Singleton Instance有时会成为您传递的某些类的成员,那么这种模式效果最好。

答案 2 :(得分:3)

来自Implementing the Singleton Pattern in C#

public sealed class Singleton
{
    Singleton()
    {
    }

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

    class Nested
    {
        static Nested()
        {
        }
        internal static readonly Singleton instance = new Singleton();
    }
}

就发布部分而言,它与单例模式相矛盾,因为如果你下次有人试图访问它时释放实例,它将获得一个违反单例模式的新实例。

答案 3 :(得分:2)

也许这会对你有所帮助:

http://en.csharp-online.net/Singleton_design_pattern:_Eager/Lazy_Singleton

这个是关于懒惰和线程安全的单例:

http://www.yoda.arachsys.com/csharp/singleton.html