- 1. Цели
- 2. Проблематика
- 3. Обсуждение
- 4. Структура
- 5. Пример
- 6. Контрольный список
- 7. Эмпирические правила
Цели
- Убедиться, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к нему.
- Инкапсулированная "инициализация в определённый момент времени" или "инициализация при первом использовании".
Проблематика
Приложению нужен один и только один экземпляр объекта. Кроме того, необходимы ленивая инициализация и глобальный доступ.
Обсуждение
Сделать класс объекта ответственным за создание одного единственного экземпляра, его инициализацию, доступ и принудительное выполнение. Объявить экземпляр как частный статический элемент данных. Предоставить публичную статическую функцию-член, которая инкапсулирует весь код инициализации и обеспечивает доступ к экземпляру.
Клиент обращается к функции доступа (используя имя класса и оператор разрешения области), когда требуется ссылка на синглетон объект.
Синглтон следует рассматривать только в том случае, если удовлетворяются все три из следующих критериев: Собственность одного экземпляра не может быть разумно назначена
- Владение одним экземпляром не может быть разумно назначено каким-либо объектам
- Желательна ленивая инициализация
- Глобальный доступ не предусмотрен
Если одно из условий не выполняется, то Синглтон не особо интересен.
Шаблон Singleton можно расширить для поддержки доступа к количеству экземпляров, зависящих от приложения.
Структура
Сделайте класс Singleton экземпляра ответственным за доступ и «инициализацию при первом использовании». Единственный экземпляр - это частный статический атрибут. Функция доступа является общедоступным статическим методом.
Пример
Шаблон Singleton гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру. Он назван в честь одноэлементного набора, который определяется как набор, содержащий один элемент. Канцелярией президента Соединенных Штатов является Синглетон. Конституция Соединенных Штатов определяет средства, с помощью которых избирается президент, ограничивает срок полномочий и определяет порядок правопреемства. В результате в любой момент может быть не более одного действующего президента. Независимо от личности действующего президента, название «Президент Соединенных Штатов» является глобальной точкой доступа, которая идентифицирует человека в офисе.
Контрольный список
- Определите частный статический атрибут в классе «Сиглтона».
- Определите публичную функцию статического доступа в классе.
- Сделайте «ленивую инициализацию» (создание при первом использовании) в функции доступа.
- Определите все конструкторы как private или protected.
- Клиенты могут использовать только функцию доступа для работы с Singleton.
Эмпирические правила
- Abstract Factory, Builder и Prototype могут использовать Singleton в своей реализации.
- Объекты фасада часто являются синглтонами, потому что требуется только один объект Facade.
- Объекты состояния часто являются синглтонами.
- Преимущество Singleton над глобальными переменными заключается в том, что вы абсолютно уверены в количестве экземпляров, когда используете Singleton, и можете также изменить код, чтобы управлять любым количеством экземпляров.
- Шаблон проектирования Singleton является одним из наиболее неуправляемых шаблонов. Синглтоны предназначены для использования, когда класс должен иметь ровно один экземпляр, не более, не меньше. Разработчики часто используют Singletons в ошибочной попытке заменить глобальные переменные. Синглтон не покончит с глобальными переменными; он просто переименовывает их.
- Когда Синглтон не нужен? Короткий ответ: большую часть времени. Длинный ответ: когда проще передать ресурс объекта в качестве ссылки на объекты, которые в нем нуждаются, а не позволять объектам обращаться к ресурсу глобально. Реальная проблема с Singleton заключается в том, что они дают вам такое хорошее оправдание, чтобы не думать о соответствующей видимости объекта. Поиск правильного баланса экспозиции и защиты объекта имеет решающее значение для поддержания гибкости кода