space2pacman
@space2pacman
Просто царь.

Как применить паттерн singleton в node.js?

Как применить паттерн singleton в node.js в разных файлах не используя глобальный объект global ?

Структура приложения
app/app.js
app/files/Shop.js
app/files/Fruits.js

app.js
let Shop = require("./files/Shop");
let shop = new Shop();


Fruits.js
let Shop = require("./Shop");
let shop = Shop.getInstance(); // цель - получение ссылки на созданный экземпляр в app.js


Так как файл подключается заново соответственно все те переменные или статические свойства(Shop.instance), которые в нем создаются чтобы хранить ссылку на экземпляр - пересоздаются.

Решение:

Shop.js
class Shop {
    constructor() {
        this._store = null;
    }

    setStore(value) {
        this._store = value;
    }

    getStore(value) {
        return this._store;
    }
}

module.exports = new Shop();


app.js
let shop = require("./files/Shop");

shop.setStore("apple");


Fruits.js
let shop = require("./Shop");

shop.getStore(); // "apple"
  • Вопрос задан
  • 2700 просмотров
Решения вопроса 1
Ты нигде не показываешь, как делаешь экспорт.

Сами по себе CommonJS модули уже реализуют Singleton.

// app/app.js
const Shop = require("./files/Shop");
const shop = new Shop();

module.exports = shop;


// app/files/Fruits.js
const shop = require('../app'); // shop, созданный в app.js, будет всегда один и тот же


При подключении файла require('../app'); заново, будет получен тот же самый shop.

Если ты хочешь получить shop из модуля Shop, то ты можешь создать его один раз там и экспортировать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы