Что такое паттерн Singleton

Ответ

Singleton — это порождающий шаблон проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему.

Ключевые особенности:

  • Приватный конструктор (чтобы нельзя было создать экземпляр извне).
  • Статический метод для получения экземпляра (обычно getInstance()).
  • Ленивая инициализация (создание объекта при первом вызове).

Пример на PHP:

class Singleton {
    private static $instance = null;

    private function __construct() {} // Запрещаем создание через new

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
var_dump($singleton1 === $singleton2); // true (один и тот же объект)

Использование:

  • Логирование, конфигурация, подключение к БД.
    Осторожно:
  • Может усложнить тестирование (глобальное состояние).
  • В многопоточной среде требует защиты от race condition.

Ответ 18+ 🔞

Давай разберем эту штуку, которая всех так бесит и восхищает одновременно. Singleton, блядь. Ну, паттерн такой, ёпта.

Представь себе, что у тебя есть, например, главный счётчик лайков на всём сайте. И если каждый скрипт начнёт плодить свои собственные экземпляры этого счётчика, то будет пиздец, а не лайки. Один насчитает 100, другой 250. Короче, бардак. Вот чтобы такого не было, умные дядьки придумали Singleton. Смысл в том, чтобы гарантировать, что у класса будет всего один-единственный экземпляр на всю программу, и чтобы к нему можно было достучаться откуда угодно. Глобальная точка доступа, блядь. Как царь и бог, один на всех.

Как это выглядит изнутри, эта хитрая жопа:

  1. Конструктор приватный. Это самое главное. Ты просто не сможешь написать new Singleton(). Компьютер тебе сразу: «Иди ты нахуй, чувак, не для тебя это». Всё, доступ закрыт. Создать объект обычным способом — нихуя.
  2. Статический метод getInstance(). Это единственная законная дверь в этот закрытый клуб. Ты не создаёшь объект, ты просишь: «Дай-ка мне экземпляр». А метод тебе в ответ: «Ага, щас, держи». И если объект ещё не создан — он его создаст. Если уже создан — вернёт существующий. Ленивая инициализация, называется. Зачем создавать что-то, если это может вообще не понадобиться?
  3. Статическое поле для хранения этого самого экземпляра. Там он и лежит, одинокий и гордый.

Вот, смотри, как это на PHP выглядит, простой пример:

class Singleton {
    // Вот тут он, наш царь и бог, пока что null
    private static $instance = null;

    // А вот и приватный конструктор! Пробуй вызвать — получишь по ебалу.
    private function __construct() {}

    // Единственный способ получить аудиенцию
    public static function getInstance() {
        // Если экземпляра ещё нет (null), то создаём его
        if (self::$instance === null) {
            self::$instance = new self(); // new self() здесь РАБОТАЕТ, потому что мы внутри класса!
        }
        // А если уже есть — просто возвращаем того же самого
        return self::$instance;
    }
}

// Используем
$singleton1 = Singleton::getInstance(); // Создался впервые
$singleton2 = Singleton::getInstance(); // А тут уже просто вернули тот же, первый

var_dump($singleton1 === $singleton2); // Выведет true, блядь! Это один и тот же объект в памяти.

Где эту штуку применяют? Да везде, где нужна одна точка управления на всю систему:

  • Логгер, который пишет в один файл.
  • Объект конфигурации, который загрузил настройки из файла раз и навсегда.
  • Подключение к базе данных (хотя тут уже спорно, но в простых случаях — да).

НО, ЧУВАК, ТРЕНИ С МОЗГОМ! Синглтон — это как острый нож. Полезно, но можно и по пальцам порезаться, и в глаз себе ткнуть.

  • Тестирование — ёперный театр. Из-за этого глобального состояния мокать его — та ещё песня. Он как прилипала, везде один и тот же.
  • Многопоточность — просто пиздец. Представь, что два потока одновременно зашли в getInstance(), увидели null и каждый создал СВОЙ экземпляр. И пошла жара, два «уникальных» синглтона. Надо либо блокировки ставить, либо сразу создавать экземпляр при старте программы. Головная боль, короче.

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