
Всем привет. В этом уроке мы с вами разберем, что такое pattern singleton и как его писать в javascript. Вообще что такое singleton? Это подход, когда класс может иметь только один экземпляр и есть какая-то точка доступа к этому экземпляру. Так как в javascript нет классов, то это можно перефразировать, как обьект может иметь только один экземпляр и есть какая-то точка доступа к этому экземпляру.
Давайте попробуем. Мы напишем модуль, который будет хранить в себе счетчик и иметь 2 публичных метода getCounter и increaseCounter.
Давайте напишем анонимную самовызывающуюся функцию, поскольку нам нужно счетчик где-то хранить, а это самое лучшее место для этого. И вызовем ее.
var counterModule = (function () {
var counter = 0;
var getCounter = function () {
return counter;
}
var increaseCounter = function () {
counter ++;
}
})();
Внутри напишем переменную counter и методы getCounter, который будет возвращать наш counter. И метод increaseCounter, который будет увеличивать наш счетчик.
Теперь мы хотим, чтобы когда мы вызывали counterModule, нам возвращался обьект у которого будет метод getInstance, который будет возвращать нам наш экземпляр.
return {
getInstance: function () {
return instance || (instance = createInstance());
}
}
Возвращаем из модуля обьект. Делаем у него метод getInstance. getInstance и будет той точкой доступа к нашему экземпляру класса. Если у нас уже создан экземпляр класс, то возвращаем его, если нет, то мы создаем экземпляр класса. Давайте теперь добавим
var counterModule = (function () {
var instance,
counter = 0;
var getCounter = function () {
return counter;
}
var increaseCounter = function () {
counter ++;
}
var createInstance = function () {
return {
getCounter: getCounter,
increaseCounter: increaseCounter
}
}
return {
getInstance: function () {
return instance || (instance = createInstance());
}
}
})();
Добавим переменную instance и еще один метод createInstance, который будет возвращать 2 публичных метода: getCounter и increaseCounter.
Еще раз, чтобы было понятно.
Давайте попробуем. Если мы в консоли напишем counterModule.getInstance(), то мы видим обьект с двумя методами getCounter и increaseCounter. И сколько мы раз getInstance мы не вызывали, то все равно он ссылается на один и тот же instance.
Теперь мы можем сделать
counterModule.getInstance().getCounter()
counterModule.getInstance().increaseCounter()
counterModule.getInstance().getCounter()
По умолчанию нам вывелся счетчик 0. После того, как мы вызвали increaseCounter, он изменился на 1. Как мы видим, если мы вызовем getCounter опять, то ничего не поменялось. Это у нас singleton и мы не перезатерли экземпляр нашего обьекта и все работает правильно.
Вот самый простой пример singleton в javascript. Впринципе желательно знать паттерны javascript и как работает singleton и применять это когда вам необходимо.