Почему Singleton считается антипаттерном?

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

Ответ

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

Основные проблемы:

  1. Глобальное состояние:

    • Singleton создает точку глобального доступа, делая состояние приложения неявным и труднопредсказуемым.
      class AppConfig {
      static let shared = AppConfig()
      private init() {}
      var theme: Theme = .light // Глобальное состояние
      }
      // Модификация в любом месте влияет на всю систему
      AppConfig.shared.theme = .dark
  2. Нарушение принципа единой ответственности (SRP):

    • Класс-синглтон часто становится "божественным объектом", аккумулирующим несвязанные функции.
  3. Сложность тестирования:

    • Невозможно изолировать тесты, так как состояние сохраняется между ними. Замена реальной реализации mock-объектом затруднена.
  4. Скрытые зависимости:

    • Классы, использующие синглтон, имеют скрытую зависимость, не отраженную в их интерфейсе (например, в инициализаторе).

Альтернативы:

  • Внедрение зависимостей (Dependency Injection): Явная передача зависимостей через инициализатор или свойство.
  • Фабрики или протоколы: Создание абстракций для управления жизненным циклом объектов.

Используйте синглтон только для объектов, которые действительно должны существовать в единственном экземпляре на протяжении всего жизненного цикла приложения (например, абстракция над аппаратным датчиком).