Javascript / Node JS创建单例对象的最佳方法

时间:2016-01-05 01:57:40

标签: javascript node.js

我完成了我的家庭作业并取得了完美的成绩。但我只是想检查一下,这是创建单例实例的最佳方式还是其他任何方式:

我使用模块模式(闭包)创建了一个单例对象,“app.js”

var singleton1 = require('./singletonUser1');
console.dir(singleton1.getlocalvariable());
singleton1.setlocalvariable(20);
console.dir(singleton1.getlocalvariable());

var singleton2 = require('./singletonUser2');
console.dir(singleton2.getlocalvariable());
singleton2.setlocalvariable(30);
console.dir(singleton.getlocalvariable());

实际单例对象(singleton.js):

var singleton = (function () {
    var localvariable = 10;

    return {
        getlocalvariable: function () {
            console.dir('This is getInstance');
            return localvariable;
        },
        setlocalvariable: function (value) {
            console.dir('This is setlocalvariable');
            localvariable = value;
        },
    };
})();

module.exports = singleton;

然后是Singleton对象用户1(singletonUser1.js):

var singletonUser1 = (function () {
    var singleton = require('./singleton');

    return {
        getlocalvariable: function () {
            console.dir('This is singletonUser1---getlocalvariable');
            return singleton.getlocalvariable();
        },
        setlocalvariable: function (value) {
            console.dir('This is singletonUser1---setlocalvariable');
            singleton.setlocalvariable(value);
        },
    };
})();

module.exports = singletonUser1;

Singleton Object User 2(singletonUser2.js)

var singletonUser2 = (function () {
    var singleton = require('./singleton');

    return {
        getlocalvariable: function () {
            console.dir('This is singletonUser2222---getlocalvariable');
            return singleton.getlocalvariable();
        },
        setlocalvariable: function (value) {
            console.dir('This is singletonUser22222---setlocalvariable');
            singleton.setlocalvariable(value);
        },
    };
})();
module.exports = singletonUser2;

请注意,单用户1和用户2是出于某个目的,根据我的项目,以上只是现实世界问题的原型。

我的问题是,我确信这是创建一个类的实例(我使用上面的app.js检查)。但这是最好的方式吗?

3 个答案:

答案 0 :(得分:5)

var Singleton = (function(){
  function Singleton(){
    this.localVariable = 5;
  }

  // Object can have instance methods as usually.
  Singleton.prototype.getLocalVariable = function() {
    return this.localVariable;
  };

  var instance;

  return function() {
    if (!instance) {
      instance = new Singleton();
    }
    return instance;
  };
})();


var instance1 = new Singleton();
var instance2 = new Singleton();

console.log(instance1 === instance2); // true

console.log(instance1.localVariable, instance2.localVariable); // 5 5

instance1.localVariable = 20;
console.log(instance1.localVariable, instance2.localVariable); // 20 20

console.log(instance1.getLocalVariable()); // 20

答案 1 :(得分:1)

这是我可配置的服务单身人士



function AdService(name) {
    console.log('new instance created');
    this.name = name || 'defaultName';
    this.greet = function () {
        console.log('hi ' + this.name);
    }
};

function Singleton() {
    this.instance = null;
    this.getInstance = function getInstance(name) {
        if (!this.instance)
            this.instance = new AdService(name);

        return this.instance;
    }
}

var singleton = new Singleton();

module.exports = function (name) {
    return singleton.getInstance(name);
}




答案 2 :(得分:0)

我发现JavaScript中的单例类有点不稳定,在java中很明显,即每当你创建一个类的对象时,你得到相同的对象,但在JS中,(至少是IMO)没有真正的类开始于。(不,ES6课程不计算,回答这个,你能拥有私人属性吗?)

你的代码只是做一个闭包,它可能是下面的代码并没有区别:

var localvariable = 10;

function getlocalvariable() {
    console.dir('This is getInstance');
    return localvariable;
};
function setlocalvariable(value) {
    console.dir('This is setlocalvariable');
    localvariable = value;
};
module.exports = {
  getlocalvariable: getlocalvariable,
  setlocalvariable: setlocalvariable
};

说,一天结束,Singleton只是一种模式,我们如何实施取决于我们,你的方式没有什么特别的错误。

编辑:比我更了解JS的人的单身实施(取自Learning JavaScript Design Patterns

var mySingleton = (function () {

  // Instance stores a reference to the Singleton
  var instance;

  function init() {

    // Singleton

    // Private methods and variables
    function privateMethod(){
        console.log( "I am private" );
    }

    var privateVariable = "Im also private";

    var privateRandomNumber = Math.random();

    return {

      // Public methods and variables
      publicMethod: function () {
        console.log( "The public can see me!" );
      },

      publicProperty: "I am also public",

      getRandomNumber: function() {
        return privateRandomNumber;
      }

    };

  };

  return {

    // Get the Singleton instance if one exists
    // or create one if it doesn't
    getInstance: function () {

      if ( !instance ) {
        instance = init();
      }

      return instance;
    }

  };

})();

var myBadSingleton = (function () {

  // Instance stores a reference to the Singleton
  var instance;

  function init() {

    // Singleton

    var privateRandomNumber = Math.random();

    return {

      getRandomNumber: function() {
        return privateRandomNumber;
      }

    };

  };

  return {

    // Always create a new Singleton instance
    getInstance: function () {

      instance = init();

      return instance;
    }

  };

})();


// Usage:

var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); // true

var badSingleA = myBadSingleton.getInstance();
var badSingleB = myBadSingleton.getInstance();
console.log( badSingleA.getRandomNumber() !== badSingleB.getRandomNumber() ); // true

// Note: as we are working with random numbers, there is a
// mathematical possibility both numbers will be the same,
// however unlikely. The above example should otherwise still
// be valid.