17 апреля 2011 г.

Pattern Singleton

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


public sealed class Singleton
{
       private static Singleton s;
       private static object SyncRoot = new object();
       private Singleton() {}
       public static Singleton Instance
       {
              get
              {
                     if (s == null)
                            look (SyncRoot)
                           {
                                   if (s == null)
                                  {
                                         s = new Singleton();
                                  }
                           }
                    return s;
              }
       }
}

Теперь, как обычно говорит Г. Шилдт, "разбор полётов". Класс обязательно должен быть sealed (дабы запретить наследование). Чтобы запретить создание экземпляра через default-конструктор посредством new, делаем его приватным. Т.е. для создания объекта дёргаем static-свойство Instance (static в силу того, что мы должны иметь возможность обращаться к нему не имея экземпляра класса). Свойство имеет только get-аксессор. Затем конструкция if проверяет экземпляр на null. Если true, лочим SyncRoot (вот применение этого приватного статического поля) и дальше опять проверяем объект на null. Вторая конструкция if нужна из-за того, что если приложение многопоточное, то второй поток ожидает после первого if. Без второго if возможно создать несколько экземпляров разными потоками, что не допустимо. Ну и в теле второго if инициализуем объект Singleton.
В итого: класс потокобезопасен, мы контролируем создание экземпляра, нет лишней блокировки потоков (лочим SyncRoot после конструкции if).

Болтовня ничего не стоит. Покажите мне код (Linus Torvalds).

Комментариев нет:

Отправить комментарий