Паттерн объектно-оринтированного программирования "Одиночка" (Singleton). В чем смысл? Как реализован?
Решил написать небольшой цикл постов, посвященных паттернам объектно-ориентированного программирования. Если вам интересна эта тема и вы хотите узнать больше - то рекомендую к прочтению книги "Design Patterns" за авторством Банды Четырех и "Head First Design Patterns" за авторством еще четырех людей :)
Для людей, совсем не знакомых с шаблонами проектирования, коротко скажу, что они являются всего-навсего проверенными временем идиомами, которые позволяют писать качественный с точки зрения дизайна код, который понятен другим людям.
Итак, начнем. Представьте, что у вас есть набор данных, а также функций для манипуляции этими данным. Тут вам сразу захочется объединить все это в класс (это ведь одна из основных идей ООП). Отлично, но что если семантически может существовать один и только один объект данного класса на всю программу. Например, он является владельцем какого-то уникального аппаратного ресурса. Тогда появляется необходимость контролировать создание объекта данного класса и следить, чтобы этот объект был уникальным. Тут-то и был придуман паттерн "Одиночка".
Так, требование есть - осталось выразить его в коде. Один из основных подходов заключается в следующем:
1) Сделать конструктор "одиночки" приватным, чтобы его нельзя было создать явно.
2) Добавить в класс публичную статическую функцию (назовем Get), тело которой будет содержать определение статической переменной типа "одиночка", а также возвращать ссылку на эту переменную.
3) Обращаться к полям "одиночки", получая ссылку на единственный объект данного класса посредством вызова метода Get.
Да, это, мягко говоря, может звучать запутанно, но пример все прояснит:
class Singleton
{
public:
Singleton& Get()
{
static Singleton instance;
return instance;
}
void DoWork();
// other methods
private:
Singleton()
{
// constructor logic
}
};
int main()
{
Singleton::Get().DoWork();
return 0;
}
Данный код гарантирует, что:
1) Создать объект класса Singleton в обход функции Get невозможно
2) Будет существовать только один экземпляр класса Singleton
В следующих постах - больше паттернов. Все хорошего дня :)
1 минута
15 августа 2023