所謂singleton pattern,就是指程序中任何時(shí)候只存該object的一個(gè)instance。 如果每次創(chuàng)建一個(gè)新的instance只為了使用同樣的功能,就該考慮采用singleton pattern了。比如數(shù)據(jù)庫連接處理,或是前端的ajax請(qǐng)求等每次都一樣的對(duì)象,采用Singleton模式不僅使代碼簡潔清晰,也減少了創(chuàng)建對(duì)象的開銷。
一個(gè)具體的例子:
var obj1 = new Singleton();
var obj2 = new Singleton();
obj1 === obj2; // true
obj1.test = 1;
obj2.test; // => 1
obj1和obj2分別新建了一個(gè)Singleton的對(duì)象實(shí)例,但實(shí)際上他們指向的是同一個(gè)對(duì)象實(shí)例。也說明了無論何時(shí),系統(tǒng)中只會(huì)存在Singleton對(duì)象的一個(gè)實(shí)例。
實(shí)現(xiàn)Singleton的方式非常多,最簡單的如不采用constructor的話,object literal也算是Singleton。下面這種方式是我認(rèn)為比較優(yōu)秀的實(shí)現(xiàn),不僅簡潔可讀,也適用于strict模式。
var Singleton = function(){
if (Singleton.prototype._singletonInstance) {
return Singleton.prototype._singletonInstance;
}
Singleton.prototype._singletonInstance = this; // first instance obect
this.test = 1;
};
這里的要點(diǎn)是在prototype上加上一個(gè)共享屬性,指向第一個(gè)調(diào)用constructor的instance。以后再調(diào)用constructor的時(shí)候,就不再生成新的實(shí)例,而是返回先前創(chuàng)建的實(shí)例了。