Singleton模式,在该实例不存在的状况下,能够经过一个方法建立一个类来实现建立类的新实例;若是实例已经存在,它会简单返回该对象的引用。Singleton不一样于静态类,由于咱们能够推迟他们的初始化。dom
var mySingleton = (function() { var instance; function init() { function privateMethod() { console.log("i am private"); } var privateVariable = "i am also private"; var privateRandomNumber = Math.random(); return { publickMethod: function () { console.log("the public can see me"); }, publicProperty: "i am also public", getRandomNumber: function () { return privateRandomNumber; } }; }; return { getInstance: function() { if (!instance) { instance = init(); } return instance; } }; }) (); var myBadSingleton = (function() { var instance; function init() { var privateRandomNumber = Math.random(); return { getRandomNumber: function() { return privateRandomNumber; } }; }; return { getInstance: function() { instance = init(); return instance; } }; })(); var singleA = mySingleton.getInstance(); var singleB = mySingleton.getInstance(); console.log(singleA.getRandomNumber()); console.log(singleB.getRandomNumber()); console.log(singleA.getRandomNumber() === singleB.getRandomNumber()); // true console.log("\n"); var badSingleA = myBadSingleton.getInstance(); var badSingleB = myBadSingleton.getInstance(); console.log(badSingleA.getRandomNumber()); console.log(badSingleB.getRandomNumber()); console.log(badSingleA.getRandomNumber() === badSingleB.getRandomNumber()); // false
Singleton模式的适用性描述以下:
一、当类只能有一个实例并且客户能够从一个众所周知的访问点访问它时。
二、该惟一的实例应该是经过子类化可扩展的,而且客户应该无须要改代码就能使用一个扩展的实例。this
var SingletonTester = (function() { function Singleton( options ) { options = options || { }; this.name = "SingletonTester"; this.pointX = options.pointX || 6; this.pointY = options.pointY || 10; } var instance; var _static = { name: "SingletonTester", getInstance: function ( options ) { console.log(instance + "\n"); if ( instance === undefined ) { instance = new Singleton( options ); } return instance; } }; return _static; })(); var test1 = SingletonTester.getInstance({pointX: 15}); console.log(test1); console.log("\n"); var test2 = SingletonTester.getInstance({pointX: 7}); console.log(test2);
结果如图:spa