Какие принципы SOLID нарушает паттерн Singleton (Одиночка)?

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

Ответ

Singleton потенциально нарушает два принципа SOLID:

1. Нарушение Принципа единственной ответственности (Single Responsibility Principle - S)

Класс Singleton начинает отвечать не только за свою основную бизнес-логику, но и за контроль над своим жизненным циклом (гарантия единственного экземпляра). Это две разные причины для изменения.

2. Нарушение Принципа инверсии зависимостей (Dependency Inversion Principle - D)

Это самое критичное нарушение. Код напрямую зависит от конкретного класса (MySingleton.shared), а не от абстракции (протокола). Это:

  • Усложняет тестирование (невозможно подменить синглтон моком).
  • Создает скрытые глобальные зависимости.
  • Делает систему жестко связанной.

Проблемный код:

class AnalyticsSingleton {
    static let shared = AnalyticsSingleton()
    private init() {}
    func track(event: String) { ... }
}

class OrderService {
    // Прямая жесткая зависимость от конкретного класса
    func placeOrder() {
        // ... логика заказа
        AnalyticsSingleton.shared.track(event: "order_placed") // Нарушение DIP
    }
}

Улучшенная версия (следование DIP):

protocol AnalyticsEngine { // Абстракция
    func track(event: String)
}

class AnalyticsService: AnalyticsEngine {
    func track(event: String) { ... }
}

class OrderService {
    private let analytics: AnalyticsEngine // Зависимость от абстракции

    init(analytics: AnalyticsEngine) { // Внедрение зависимости
        self.analytics = analytics
    }

    func placeOrder() {
        // ... логика заказа
        analytics.track(event: "order_placed") // Корректно
    }
}

// Использование и тестирование
let service = OrderService(analytics: AnalyticsService()) // Или MockAnalyticsEngine в тестах

Вывод: Singleton следует использовать крайне осторожно, предпочитая внедрение зависимостей.