# Singleton

**Singleton(одиночка)** - порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет **единственный экземпляр** некоторого класса, и предоставляющий **глобальную** точку доступа к этому экземпляру. У класса есть только один экземпляр, и он предоставляет к нему глобальную точку доступа. При попытке создания данного объекта он создаётся только в том случае, если ещё не существует, в противном случае возвращается ссылка на уже существующий экземпляр и нового выделения памяти не происходит.

На данный момент мы используем синглтон для классов менеджеров или очень важных классов, существующих в единственном экземпляре, и *настоятельно рекомендуем использовать синглтон исключительно в этих случаях*. **Синглтон** должен придерживаться максимально возможной **инкапсуляции**. Паттерн в классе следует реализовывать через наследование от класса Singleton из стартерпака (в качестве дженерика надо указывать тип текущего класса, например LevelController : Singleton). Однако надо помнить, что работа в **Awake в синглтоне недопустима**, т.к. он еще не инициализировался в этот момент. Но и для этого есть выход, чтоб Awake работал, необходимо переопределить метод **AwakeSingleton**() и выполнять все необходимые действия в нем.

Нужно понимать что синглтон это анти-паттерн, который порождает кучу зависимостей тем самым нарушая **SOLID**. Поэтому стараемся использовать его по минимуму.
