Closure: The Definitive Guide на странице 70 Определяет goog.addSingletonGetter()
следующим образом:
Для класса с конструктор, который принимает нулевые аргументы, goog.addSingletonGetter()
добавляет статический метод его функции конструктора по имени getInstance()
, который возвращает тот же экземпляр этого объекта, когда он вызывается. Как правило, он должен использоваться вместо функции-конструктора, если он существует.
Один подход должен был бы создать синглтон после Instance в статическом свойстве шаблон проектирования, представленные в JavaScript Patterns на странице 143 с добавлением статической getInstance()
функции.
/**
* @param {string=} opt_x
* @param {string=} opt_y
* @constructor
*/
Foo = function(opt_x, opt_y) {
if(Foo.instance_) {
return Foo.instance_;
}
/**
* @type {string}
* @private
*/
this.x_ = goog.isDefAndNotNull(opt_x) ? opt_x : 'default_X';
/**
* @type {string}
* @private
*/
this.y_ = goog.isDefAndNotNull(opt_y) ? opt_y : 'default_Y';
Foo.instance_ = this;
};
/**
* Get the singleton instance of Foo.
* @param {string=} opt_x
* @param {string=} opt_y
*/
Foo.getInstance = function(opt_x, opt_y) {
if (Foo.instance_) {
return Foo.instance_;
}
return new Foo(opt_x, opt_y);
};
Преимущество использования этого шаблона является то, что она защищает вас от случайного построения нескольких экземпляров в том случае, если кто-то написать:
var foo = new Foo();
...
// thousands of lines later
var snafoo = new Foo(); // Returns the singleton instance.