ruk·si

JS Pattern
Singleton

Updated at 2015-05-13 13:07

Singleton pattern allow creating only one instance of a prototype.

var Universe = (function() {
  'use strict';

  var instance = null;

  /**
   * @constructor
   */
  var Universe = function() {
    if (instance !== null) {
      return instance;
    }
    // All the initialization here.
    this.startTime = 0;
    instance = this;
  };

  Universe.getInstance = function() {
    return new Universe();
  };
  Universe.prototype.getTime = function() {
    return this.startTime;
  };
  Universe.prototype.tick = function() {
    return ++this.startTime;
  };

  return Universe;
}());

// Two different ways of accessing the singleton,
// choose which one you like.
var uni1 = new Universe();
var uni2 = new Universe();
var uni3 = Universe.getInstance();
console.assert(uni1 === uni2);
console.assert(uni2 === uni3);
console.assert(uni1.getTime() === 0);
console.assert(uni3.getTime() === 0);
console.assert(uni2.tick() === 1);
console.assert(uni1.getTime() === 1);
console.assert(uni3.tick() === 2);
var uni4 = Universe.getInstance();
console.assert(uni4.getTime() === 2);

var NotSingleton = function() {};
var not1 = new NotSingleton();
var not2 = new NotSingleton();
console.assert(not1 !== not2);