> Что такое паттерн 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.jsconst 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
> Похожие задачи по frontend
В чем заключается принцип работы кластеров Node.js и как они помогают масштабированию приложения
Что такое протокол HTTP и как он работает
Что такое call, apply и bind в JavaScript и в чем их разница
Что такое Dependency Injection (DI)
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью