> Что такое паттерн Singleton (Node.js, JavaScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Mosline

Стек: Node.js, JavaScript

> Пример ответа

Короткий ответ

Паттерн Singleton гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему. В JavaScript это часто реализуется через модуль, который экспортирует объект, или через класс с приватным конструктором и статическим методом getInstance. Singleton полезен для управления общим состоянием, например, для конфигурации приложения или подключения к базе данных.

Подробное объяснение

Singleton решает две задачи: контролирует создание единственного экземпляра класса и предоставляет глобальную точку доступа к нему. В Node.js модули по умолчанию кешируются после первого require, что делает их естественной реализацией Singleton - экспортированный объект будет одним и тем же во всех файлах.

Основные характеристики:

  • приватный конструктор (или его имитация)
  • статическое поле для хранения экземпляра
  • статический метод getInstance, который создаёт экземпляр при первом вызове и возвращает его при последующих

В JavaScript нет настоящих приватных конструкторов, поэтому Singleton часто реализуют через замыкание или модуль. В TypeScript можно использовать private constructor.

На практике

Singleton применяется для:

  • управления конфигурацией приложения
  • подключения к базе данных (чтобы не создавать множество соединений)
  • логирования
  • кеширования данных
  • управления состоянием (например, store в Redux - это Singleton)

Важно помнить, что Singleton может усложнить тестирование, так как создаёт глобальное состояние. В Node.js модули уже являются Singleton по умолчанию, поэтому явная реализация класса с getInstance часто избыточна.

Пример кода

JAVASCRIPT
// Реализация через класс (ES6)
class Database {
constructor() {
if (Database.instance) {
return Database.instance;
}
this.connection = null;
Database.instance = this;
}
connect() {
// логика подключения
this.connection = 'connected';
}
}
// Использование
const db1 = new Database();
const db2 = new Database();
console.log(db1 === db2); // true
// Альтернатива через модуль (рекомендуется в Node.js)
// config.js
const config = {
apiUrl: 'https://api.example.com',
port: 3000
};
module.exports = config;
// В другом файле
const config = require('./config'); // всегда один и тот же объект

Как отвечать на собеседовании

Начни с определения: "Singleton - это порождающий паттерн, который гарантирует единственный экземпляр класса". Приведи пример использования в Node.js (модули как Singleton). Упомяни, что в JavaScript реализация проще благодаря модульной системе. Если спросят про недостатки, скажи о проблемах с тестированием и глобальном состоянии. Для junior достаточно базового понимания.

Что проверяет интервьюер

  • понимание принципов ООП и порождающих паттернов
  • знание особенностей JavaScript (модули, замыкания)
  • умение объяснить, когда Singleton полезен, а когда вреден
  • способность написать простую реализацию

Типичные ошибки

  • путают Singleton с простым глобальным объектом
  • не понимают, что в Node.js модули уже Singleton
  • пытаются реализовать сложную защиту от создания нескольких экземпляров, когда это не нужно
  • забывают про проблемы с многопоточностью (в Node.js это редко актуально, но стоит упомянуть)
  • используют Singleton для всего подряд, вместо того чтобы подумать о dependency injection

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью