← Назад к вопросам
Сколько ответственностей у Singleton?
2.0 Middle🔥 241 комментариев
#Docker, Kubernetes и DevOps
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Singleton Pattern: количество ответственностей
Singleton имеет две ответственности, что нарушает Single Responsibility Principle (SRP).
Первая ответственность: управление экземпляром
public class Logger {
private static Logger instance;
private Logger() {}
public static Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
}
Spring управляет этой ответственностью автоматически для @Component бинов, которые по умолчанию имеют scope="singleton".
Вторая ответственность: бизнес-логика
public class Logger {
public void log(String message) {
System.out.println("[LOG] " + message);
}
public void error(String message) {
System.err.println("[ERROR] " + message);
}
}
Это может меняться независимо от управления экземпляром.
Правильный подход
Использовать Dependency Injection, который разделяет ответственности:
public interface Logger {
void log(String message);
}
@Component
public class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.out.println(message);
}
}
@Component
public class MyService {
private final Logger logger;
public MyService(Logger logger) {
this.logger = logger;
}
}
Две ответственности Singleton:
- Гарантирование единственного экземпляра (управление жизненным циклом)
- Реализация бизнес-логики (собственная функциональность)
Почему это проблема
Если нужно изменить способ создания экземпляра (например, на лениво-инициализируемый или потокобезопасный), это потребует изменения класса, который также содержит бизнес-логику.
Современный подход: DI контейнеры управляют инстансами, классы сосредотачиваются только на своей логике, соблюдая Single Responsibility Principle.