Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если бы стояла задача описать этот паттерн одной фразой, то она получилась бы примерно следующей: Singleton — это класс, который может иметь только один экземпляр.
Но у него есть и существенный недостаток: основная цель паттерна singleton — обеспечить доступ к объекту без использования глобальных переменных, а данный способ предоставляет доступ к переменной app только в текущей области видимости.
var obj = {
createAnimal: function(){
return new this.animal();
}
};
obj.animal = Dog;
obj.animal = Cat;
var animal = {
cat: Cat,
dog: Dog
};
new animal['cat'];
var s = new Singleton();
Что делает оператор new? Создает новый объект. А тут всегда будет возвращатся один и тот же.На мой взгляд, многие классические паттерны в javascript просто не имеют смысл, так как этот язык гибче тех, на которые они в первую очередь рассчитаны.
Но в javascript нет классов!
А если сделать функцию она магическим образом не будет глобальной? В requirejs можно возвращать и объект, вы не поверите.
Суть фабричного метода — не в том, что вы описали, а в том, чтобы предоставить возможность подклассам переопределить класс (или в общем случае — способ создания) объектов, которые создаются в процессе работы этого класса
Назначение фабрики в том, чтобы создавать объекты. Этот шаблон обычно реализуется в виде классов или в виде статических методов классов и преследует следующие цели:
• Выполнение повторяющихся операций, необходимых при создании похожих объектов
• Предложить пользователям фабрики способ создания объектов без необходимости знать их тип (класс) на этапе компиляции
var obj = { createAnimal: function(){ return new this.animal(); } }; obj.animal = Dog; obj.animal = Cat;
То что вы описали тоже решается без каких то проблем и мысле о «паттернах»:
var animal = { cat: Cat, dog: Dog }; new animal['cat'];
можно возвращать объект, но это будет менее гибко: мы теряем возможность безболезненного избавления от дублирования кода путем наследования.
var singleton = new Parent();
singleton.overloadedMethod = function(){};
return singleton;
var child = Object.create(singleton);
var parent = {},
child;
function Surrogate(){}
Surrogate.prototype = parent;
child = new Surrogate();
var parent = {},
child = Object.create(parent,{});
var parent = {},
child = {},
key;
for (key in parent){
if (parent.hasOwnProperty(key) && !child.hasOwnProperty(key)){
child[key] = parent[key];
}
}
Usefulness warning: The following discussion is not so useful as a practical pattern but more as a theoretical exercise in imitating the workarounds for issues related to the designs of some (statically, strongly typed) class-based languages in which functions are not first-class
objects.
The second point is more important in static class languages in which it may be nontrivial to create instances of classes, which are not known in advance (in compile time). In javaScript, this part of the implementation is quite easy.
true = false # Happy debugging!.#clone() или фабрику объектов.user = new User # as singleton — плохоuser = Registry.get 'current_user' — хорошоНазываете класс CurrentUserSingleton и проблем точно не будет
Использование паттернов проектирования в javaScript: Порождающие паттерны