如何使Singleton成为一个懒惰的实例化类?

时间:2011-01-04 03:02:34

标签: c# singleton lazy-evaluation

我有一个由另一个库实例化的类。我无法控制该库代码,但仍需要确保它不能创建我的类的多个实例。

有可能吗?怎么样?

2 个答案:

答案 0 :(得分:4)

这个问题的一些简单解决方案隐藏了一些问题,为了充分理解这个问题,我建议阅读以下文章

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

以最佳解决方案结束

public sealed class Singleton
{
    Singleton()
    {
    }

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

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

答案 1 :(得分:1)

如果它正在调用您的类的构造函数,那么您唯一能做的就是在构造函数中抛出异常(如果您确定先前已创建实例)。由于您无法控制其他库,因此您将无法使用工厂方法或静态属性,这通常是您控制对单例的访问的方式。

根据您的具体情况,您还可以考虑使用包装单例实例的轻量级代理。在此示例中,可以创建任意数量的MyObjectProxy,但它们都将其实现推迟到MyObject的单个实例。

public class MyObject {

    internal MyObject() {
    }

    private int _counter;

    public int Increment() {
        return Interlocked.Increment(ref _counter);
    }

}

public class MyObjectProxy {

    private static readonly MyObject _singleton = new MyObject();

    public MyObjectProxy() {
    }

    public int Increment() {
        return _singleton.Increment();
    }

}
相关问题