Xaqron
Xaqron

Reputation: 30847

How to make Singleton a Lazy instantiated class?

I have a class which is lazy instantiated by another library. I don't have control over that library code but still need to be sure it cannot create more than one instance of my class.

Is it possible ? how ?

Upvotes: 3

Views: 573

Answers (2)

Jader Dias
Jader Dias

Reputation: 90475

Some simple solutions to this question hides some problems, for a full understanding of this matter I recommend the reading of the following article

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

Which concludes with an optimal solution

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();
    }
}

Upvotes: 4

Josh
Josh

Reputation: 69262

If it's calling your class's constructor, the only thing you can do is throw an exception in the constructor if you determine that an instance was previously created. Since you don't have control over the other library, you wouldn't be able to use a factory method or static property which would normally be the way you control access to a singleton.

Depending on your situation, you may also look into using a lightweight proxy that wraps a singleton instance. In this example, any number of MyObjectProxy can be created but they all defer their implementation to a single instance of 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();
    }

}

Upvotes: 1

Related Questions