Этот шаблон используется при проектировании класса, который может иметь только один экземпляр. Это ограничение оправдывает себя, когда объект класса очень громоздкий и нам нет необходимости плодить эти объекты. Пример кода:
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).
Комментариев нет:
Отправить комментарий