Реализация паттерна Singleton на C#
От: Mishka.NET Норвегия  
Дата: 25.07.02 16:30
Оценка:
Тут кто-то в соседнем форуме плакалася, что нет статей и Q&A. Вот, так сказать, для разугреву:
Предположим, что необходимо, чтобы создавался только один объект для заданного класса. Поскольку реализация этой задачи на С# даже не заслуживает внимания, мы сосредоточимся на её более интересном варианте: пусть кроме этого нам известно, что этот объект ресурсоёмкий, но создавать его мы можем очень быстро. Тогда было б хорошо чтоб он удалялся всякий раз когда он нам не нужен. Конечно удалять что-то нам не позволено, но намекнуть мы можем:
public sealed class X
{
  public static X Instance()
  {
    object o = wr.Target; // существует ли ещё объект?
    if (o == null) // если нет, то создаём его заново
    {
      o = new X();
      wr.Target = o;
    }
    return o as X; // возвращаем объект
  }
  private X(){}
  private static WeakReference wr = new WeakReference(null);
}

А вот как это работает:
X x = X.Instance(); // нам понадобился объект.
// здесь мы его используем
...
// пусть в какой-то момент x вышел из области видимости и GC начал собирать мусор
// поскольку в классе X мы храним слабую ссылку на объект, то он будет удалён
...
X x = X.Instance(); // нам опять понадобился объект.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.