мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| glossary:design:patterns:creational:singleton [2025/03/23 21:35] – создано radi0dev | glossary:design:patterns:creational:singleton [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 6: | Строка 6: | ||
| {{: | {{: | ||
| - | |||
| - | |||
| - | ===== Суть ===== | ||
| **Одиночка** — это порождающий паттерн проектирования, | **Одиночка** — это порождающий паттерн проектирования, | ||
| Строка 20: | Строка 17: | ||
| - **Предоставляет глобальную точку доступа**. Это не просто глобальная переменная, | - **Предоставляет глобальную точку доступа**. Это не просто глобальная переменная, | ||
| - | ![[singleton-comic-1-ru 1.png]] | + | {{: |
| + | Применим: | ||
| + | * **Когда в программе должен быть единственный экземпляр какого-то класса**: | ||
| + | * **Когда вам хочется иметь больше контроля над глобальными переменными**: | ||
| + | ++++Преимущества и недостатки | | ||
| - | Все | + | ^ **+** ^ **-** ^ |
| - | ## Структура | + | | Гарантирует наличие единственного экземпляра |
| - | ![[structure-ru-indexed.png]] | + | | Предоставляет к нему глобальную |
| - | 1) **Одиночка** определяет | + | | Реализует отложенную инициализацию объекта-одиночки | Проблемы мультипоточности | |
| - | ## Применимость | + | | | Требует постоянного создания Mock-объектов |
| - | **Когда в программе должен быть единственный экземпляр какого-то класса**: | + | ++++ |
| - | Одиночка скрывает от клиентов все способы создания нового | + | |
| - | **Когда вам хочется иметь больше контроля над глобальными переменными**: | + | ===== Структура ===== |
| - | В отличие от глобальных переменных, | + | |
| - | ## Шаги реализации | + | |
| - | ==хы== | + | |
| - | ## Преимущества и недостатки | + | |
| - | | **+** | **-** | | + | {{: |
| - | | --------------------------------------------------- | ---------------------------------------------------------------- | | + | |
| - | | Гарантирует наличие единственного экземпляра класса | Нарушает _принцип единственной ответственности класса_ | + | |
| - | | Предоставляет к нему глобальную точку доступа | + | |
| - | | Реализует отложенную инициализацию объекта-одиночки | Проблемы мультипоточности | + | |
| - | | | Требует постоянного создания Mock-объектов при юнит-тестировании | | + | |
| - | ## Отношения с другими паттернами | + | Одиночка определяет статический метод `getInstance`, |
| + | |||
| + | Все реализации одиночки сводятся к тому, чтобы скрыть конструктор по умолчанию и создать | ||
| + | |||
| + | ===== Примеры ===== | ||
| + | |||
| + | ++++Наивный Одиночка | | ||
| - | ## Примеры | ||
| - | Наивный Одиночка (небезопасный в многопоточной среде !!!) | ||
| Топорно реализовать Одиночку очень просто — достаточно скрыть конструктор и предоставить статический создающий метод. | Топорно реализовать Одиночку очень просто — достаточно скрыть конструктор и предоставить статический создающий метод. | ||
| - | ```cpp | + | |
| + | (небезопасный в многопоточной среде !!!) | ||
| + | < | ||
| /** | /** | ||
| * Класс Одиночка предоставляет метод `GetInstance`, | * Класс Одиночка предоставляет метод `GetInstance`, | ||
| Строка 152: | Строка 149: | ||
| BAR | BAR | ||
| FOO | FOO | ||
| - | ``` | + | </ |
| + | ++++ | ||
| - | Многопоточный Одиночка: | + | ++++Многопоточный Одиночка |
| - | ```cpp | + | < |
| /** | /** | ||
| * Класс Одиночка предоставляет метод `GetInstance`, | * Класс Одиночка предоставляет метод `GetInstance`, | ||
| Строка 249: | Строка 246: | ||
| int main() | int main() | ||
| { | { | ||
| - | std::cout <<" | + | std::cout <<" |
| "If you see different values, then 2 singletons were created (booo!!)\n\n" | "If you see different values, then 2 singletons were created (booo!!)\n\n" | ||
| " | " | ||
| Строка 259: | Строка 256: | ||
| return 0; | return 0; | ||
| } | } | ||
| - | ``` | + | </ |
| Вывод: | Вывод: | ||
| - | ``` | + | < |
| - | If you see the same value, then singleton was reused (yay! | + | If you see the same value, then singleton was reused (yay!) |
| If you see different values, then 2 singletons were created (booo!!) | If you see different values, then 2 singletons were created (booo!!) | ||
| Строка 268: | Строка 266: | ||
| FOO | FOO | ||
| FOO | FOO | ||
| - | ``` | + | </ |
| + | ++++ | ||