Ответ
Сам по себе паттерн 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 { /* Загрузка конфигураций */ }