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

«Что такое паттерн Singleton?» — вопрос из категории Паттерны, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Во Flutter/Dart Singleton часто используется для сервисов, менеджеров или клиентов (например, API-клиент, кэш, настройки приложения, логгер), где необходимо централизованное управление состоянием или ресурсами.

Классическая реализация на Dart:

class DatabaseConnection {
  // Статическая приватная переменная, хранящая единственный экземпляр
  static final DatabaseConnection _instance = DatabaseConnection._internal();

  // Фабричный конструктор, возвращающий единственный экземпляр
  factory DatabaseConnection() {
    return _instance;
  }

  // Приватный внутренний конструктор
  DatabaseConnection._internal() {
    // Инициализация подключения к базе данных
    print('Database connection established');
  }

  // Пример метода
  Future<void> query(String sql) async {
    // ... выполнение запроса
  }
}

void main() {
  var db1 = DatabaseConnection();
  var db2 = DatabaseConnection();
  print(identical(db1, db2)); // true — это один и тот же объект
}

Важные замечания для Flutter:

  • Ленивая инициализация: В приведённом примере экземпляр создаётся при первом обращении к DatabaseConnection() благодаря тому, как Dart инициализирует статические поля.
  • Альтернативы для управления зависимостями: В больших Flutter-приложениях вместо чистого Singleton часто используют пакеты для внедрения зависимостей (get_it, provider, riverpod), которые предоставляют более контролируемый и тестируемый способ иметь единственный экземпляр объекта в определённой области видимости.
  • Тестирование: Классический Singleton может усложнять модульное тестирование из-за глобального состояния. Использование интерфейсов и внедрение зависимостей через конструктор предпочтительнее для тестируемости.