Javascript Шаблони - Singleton Pattern
Сингълтон шаблонът е известен с това, че инстанциира нови обекти чрез един единствен обект. Класическия Сингълтон се имплементира чрез създаване на клас със метод, който създава нови инстанции на класа ако той не съществува. Ако класът съществува, се връща референция към дадения обект.
В JavaScript, Сингълтонът се използва като споделен namespace, който изолира имплементиращия код от глобалния namespace, като предоставя един единствен начин за достъп до фукнциите.
var mySingleton = (function() {
// променлива, която съхранява референцията до Сингълтона
var instance;
function init() {
// Самият Сингълтон
function privateMethod() {
console.log('I\'m private');
}
var privateVariable = 'Another private member';
var privateNumber = Math.random();
return {
publicMethod: function() {
console.log('Public Method!');
}
publicProperty: 'I\'m also public!';
getRandomNumber: function() {
return privateRandomNumber;
}
};
};
return {
// Връщаме инстанцията на Сингълтона, ако съществува.
// Ако не, го създаваме
getInstance: function() {
if(!instance) {
instance = init();
}
return instance
}
}
}());
Използването на този шаблон става по следния начин
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log(singleA.getRandomNumber() !== single.getRandomNumber()); // в 99% от случаите ще върне false;
Това, което различава Сингълтона от другите обекти е начинът, по който се достъпва. Това става чрез публичният метод getInstance()
, като не използваме new mySingleton()
.
В книгата на GoF(Gang of Four), Сингълтона е описан по следния начин:
Трябва да има точно една инстанция на класа и тя трябва да е достъпна от клиента по възможно най-лесен начин.
Сингълтонът и статичните обекти са полезни, но не трябва да се използват твърде много. Този шаблон е подходящ, когато точно един обект е нужен за координацията на други обекти в системата. Използването на Сингълтона в JavaScript е знак, че трябва да преосмислим дизайна си.
Сингълтоните са трудни за тестване заради проблеми започващи от скрити (частни) функционалностти до трудностти със създаването на нови инициализации.
Обощение (TL;DR)
- Сингълтон шаблона инициализира нови обекти чрез използването на един единствен обект.
- В JavaScript, шаблона се използва като споделен namespace, изолиращ имплементиращия код от глобалния namespace.
- Използването на Сингълтони трябва да се избягва, а прекаленото използване на този шаблон е признак за проблеми в дизайна на приложението.