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