Как управлять экземпляром Singleton? - PullRequest
4 голосов
/ 17 февраля 2010

Это дубликат: Что такое синглтон в C #?

Я не думаю, что это дубликат, поскольку здесь я ищу лучшую стратегию освобождения / утилизации объекта Singleto, когда он не используется.

Как реализовать Singleton, чтобы экземпляр объекта можно было освобождать / утилизировать, когда все его ссылки не используются? И когда кто-либо хочет получить экземпляр Singleton, он загружается по требованию.

Ответы [ 4 ]

7 голосов
/ 17 февраля 2010

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

Даже если ваш Singleton резервирует ресурс, который вы хотите динамически разблокировать и зарезервировать, вы не должны уничтожать и заново создавать экземпляр Singleton. Это противоречило бы общему значению и использованию шаблона, который может (в лучшем случае) вызвать проблемы со связью в вашей команде или (в худшем случае) незначительные ошибки в вашем приложении.

Вместо этого вы можете иметь объект Singleton для внутреннего управления этим ресурсом: освободите его, если он не использовался в течение некоторого времени, или если его число ссылок уменьшилось до 0.

Вам также следует рассмотреть возможность использования Factory для доступа к этому ресурсу. Это дает вам гораздо больше свободы для управления обработкой рассматриваемого ресурса. Вы также можете повторно использовать созданный объект для внутреннего использования, фактически сохраняя количество объектов не более 1.

4 голосов
/ 17 февраля 2010

Как говорят некоторые другие ответы, Реализация шаблона Singleton в C # является одним из лучших ресурсов для Singletons в целом.

Если вы хотите, чтобы ваш singleton был выпущен, когда на него нет ссылокВ другом месте вы можете убрать свой любимый шаблон с вышеупомянутого сайта и поместить его в 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 иногда является членом определенных классов, которые вы проходите.

3 голосов
/ 17 февраля 2010

С Реализация шаблона Singleton в 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();
    }
}

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

2 голосов
/ 17 февраля 2010

может быть, это поможет вам:

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

, и это о ленивом и поточно-ориентированномсинглтон:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...