Нарушает ли паттерн Singleton принцип единственной ответственности (SRP)?

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

Ответ

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

Нарушение SRP происходит на практике, когда в Singleton-класс начинают добавлять разнородную бизнес-логику, превращая его в "God Object".

Пример нарушения SRP (плохо):

class AppManager {
    static let shared = AppManager()
    private init() {}

    var user: User?
    func authenticate() { /* ... */ }
    func saveToDatabase() { /* ... */ }
    func fetchRemoteConfig() { /* ... */ }
    func logEvent() { /* ... */ }
    // Слишком много ответственностей!
}

Решение с соблюдением SRP (хорошо):

// Singleton отвечает только за управление состоянием пользователя
class UserSession {
    static let shared = UserSession()
    private init() {}
    var currentUser: User?
}

// Отдельные сервисы с конкретными обязанностями
class AuthService { /* Логика входа/выхода */ }
class DatabaseService { /* Работа с локальным хранилищем */ }
class ConfigService { /* Загрузка конфигураций */ }