Singleton — это порождающий паттерн проектирования, который гарантирует существование только одного экземпляра объекта и предоставляет глобальную точку доступа к нему. В контексте JavaScript и библиотеки Bliss.js применение Singleton-подхода часто связано с управлением состоянием компонентов, глобальными утилитами или сервисами.
Singleton создаёт единственный объект, скрывая конструктор и предотвращая создание дополнительных экземпляров. В JavaScript это можно реализовать через:
В Bliss.js Singleton часто используется для управления глобальными событиями и DOM-операциями, так как библиотека ориентирована на удобное и декларативное взаимодействие с DOM.
const EventBus = (function() {
let instance;
function createInstance() {
const listeners = {};
return {
on(event, callback) {
if (!listeners[event]) listeners[event] = [];
listeners[event].push(callback);
},
emit(event, data) {
if (listeners[event]) {
listeners[event].forEach(fn => fn(data));
}
}
};
}
return {
getInstance() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
Ключевые моменты реализации:
instance хранит единственный экземпляр
объекта.getInstance() создаёт объект только один раз и
возвращает его при последующих вызовах.on и emit,
доступны через этот единственный экземпляр, что предотвращает
дублирование и конфликт обработчиков событий.// eventBus.js
const listeners = {};
export function on(event, callback) {
if (!listeners[event]) listeners[event] = [];
listeners[event].push(callback);
}
export function emit(event, data) {
if (listeners[event]) {
listeners[event].forEach(fn => fn(data));
}
}
Использование модуля автоматически создаёт Singleton, так как импортированный модуль инициализируется один раз при загрузке приложения. Это особенно удобно в проектах с Bliss.js, где требуется единый объект для управления DOM-событиями.
import { on, emit } from './eventBus.js';
on('click', data => console.log('Clicked', data));
emit('click', { target: 'button#submit' });
Bliss.js предоставляет утилиты для работы с элементами DOM через цепочки методов, например:
$$('.button').on('click', function() {
alert('Кнопка нажата');
});
Singleton может использоваться для создания глобального менеджера взаимодействий с DOM:
const DOMManager = (function() {
let instance;
function createInstance() {
return {
bind(selector, event, callback) {
$$(selector).on(event, callback);
},
unbind(selector, event, callback) {
$$(selector).off(event, callback);
}
};
}
return {
getInstance() {
if (!instance) instance = createInstance();
return instance;
}
};
})();
// Использование
const dom = DOMManager.getInstance();
dom.bind('.button', 'click', () => console.log('Нажатие'));
Преимущества:
$$ и другими
утилитами для работы с DOM.Singleton-паттерн в Bliss.js обеспечивает мощный инструмент для централизованного управления состоянием и событиями, сохраняя чистоту кода и оптимизируя взаимодействие с DOM. Использование этого подхода позволяет выстраивать масштабируемую архитектуру с единым источником правды.