impeee
@impeee
nodejs/erlang developer

Реализация Singleton через мемоизацию?

Паттерн "одиночка" гласит, что один класс может породить только один экземпляр. У мемоизации, если вдуматься, такой же принцип работы:

let Singleton = function(foo) {
  Singleton = Function;
  this.foo = foo;
};

let singleton1 = new Singleton(3);
let singleton2 = new Singleton(5);

singleton1; // Singleton {foo: 3}
singleton2; // анонимная функция


Паттерн реализован, как считаете?
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ответы на вопрос 1
impeee
@impeee Автор вопроса
nodejs/erlang developer
Singleton может быть далее по коду переопределен теоретически:

// ...
Singleton = function() {};
let singleton3 = new Singleton(); // Singleton {}


О нет, моя прекрасная логика! У нас теперь 2 экземпляра класса фактически в рамках одного приложения. Есть один выход, но класс Singletone станет "грязной" функцией, которая будет обращаться к переменным внешнего контекста:

Singletone = function(foo) {
  this.foo = foo;
  Singletone = Function;
  Object.defineProperty(global, 'Singletone', {writable: false});
};


Допустим, мы находимся в среде nodejs, где глобальным объектом выступает "global". Здесь я не ставлю var перед Singletone, поэтому из любого участка он всплывет, и станет свойством глобального объекта, которое уже мы можем запретить перезаписывать (после первого исполнения). Как-то так
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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