Ответ
Чаще всего используется паттерн Singleton (Одиночка). Он обеспечивает создание единственного экземпляра класса и глобальную точку доступа к нему.
Применение: Управление общими ресурсами — конфигурация приложения, логгер, пул соединений с базой данных.
Пример реализации на Java:
public class DatabaseConnection {
private static DatabaseConnection instance;
private Connection connection;
private DatabaseConnection() {
// Приватный конструктор
}
public static synchronized DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
public Connection getConnection() {
return connection;
}
}
Ключевые аспекты и best practices:
- Потокобезопасность: Базовая реализация требует синхронизации (
synchronized). Более эффективные варианты:- Double-Checked Locking (с
volatile). - Статическая инициализация (
private static final Singleton instance = new Singleton();). - Enum Singleton (рекомендовано Джошуа Блохом).
- Double-Checked Locking (с
- Ленивая (Lazy) vs. Ранняя (Eager) инициализация: Singleton может создаваться при первом вызове
getInstance()(ленивая) или при загрузке класса (ранняя). - Проблемы: Усложняет модульное тестирование из-за глобального состояния и скрытых зависимостей.
- Современные альтернативы: Внедрение зависимостей (Dependency Injection, например, через Spring), где «одиночка» управляется контейнером IoC.