單例模式是一種非常極端的模式,它保證了一個類在整個應用程式域中只有一個實體,意味著當你多次建立某一個類的例項的時候它們都是第一次建立的那個。
在Java或c#環境實現單例模式很簡單,只需要定義靜態變數即可,將物件存入靜態變數中即可,靜態變數不會隨類例項而變換。同理在javascript也是類似實現原理。
公共靜態變數實現單例模式
var Earth = (function () { if (typeof Earth.instance === 'object') { return Earth.instance; } this.name = "地球"; this.age = 46 * 1000 * 1000 * 10000; Earth.instance = this; return Earth.instance; });
程式碼中的Earth.instance 即為公共靜態變數,在例項化的物件earth1中是看不見公共靜態變數
但在Earth類中是可以看見的
var earth1 = new Earth(); var earth2 = new Earth(); console.log(earth1 === earth2);
由於是單例模式因此結果顯然為‘true’
私有靜態變數實現單例模式
將例項儲存至公有變數中很簡單,但有一個致命問題公共變數可以在外部被更改,因此最好的方式還是使用私有靜態變數,使用私有靜態變數需要通過及時函式和閉包來實現。
var Earth = (function () { var instance; return function () { if (typeof instance === 'object') { return instance; } this.name = "地球"; this.age = 46 * 1000 * 1000 * 10000; instance = this; return instance; } }());
整個函式返回一個閉包函式,並且立即執行,及時函式表達方式:(function(){}())
再次執行
var earth1 = new Earth(); var earth2 = new Earth(); console.log(earth1 === earth2);
得到結果依然為’true’
總結:
單例模式是非常極端模式,可通過靜態變數儲存例項的方式來實現,通過私有靜態的實現需要依靠於及時函式和閉包,關於及時函式和閉包就不再這裡累贅了。