Как сделать Синглтон классом Lazy? - PullRequest
3 голосов
/ 04 января 2011

У меня есть класс, который создается другой библиотекой. У меня нет контроля над этим библиотечным кодом, но я все еще должен убедиться, что он не может создать более одного экземпляра моего класса.

Возможно ли это? как?

Ответы [ 2 ]

4 голосов
/ 04 января 2011

Некоторые простые решения этого вопроса скрывают некоторые проблемы, для полного понимания этого вопроса я рекомендую прочитать следующую статью

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 голос
/ 04 января 2011

Если он вызывает конструктор вашего класса, единственное, что вы можете сделать, это выбросить исключение в конструкторе, если вы определите, что экземпляр был создан ранее.Поскольку у вас нет контроля над другой библиотекой, вы не сможете использовать фабричный метод или статическое свойство, которое обычно используется для управления доступом к одноэлементному файлу.Вы также можете использовать легковесный прокси, который обёртывает экземпляр Singleton.В этом примере может быть создано любое количество 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();
    }

}
...