Q:何為單例
A:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪(fǎng)問(wèn)它的全局訪(fǎng)問(wèn)點(diǎn)
給一個(gè)顯式表達(dá)的例子
//Singelation有個(gè)getinstance方法,調(diào)用一次此方法跟調(diào)用第二次得到相同的實(shí)例
var Singelation = function(name){
this.name = name;
this.instance = null;
}
Singelation.getInstance = function(name){
return this.instance || (this.instance = new Singelation(name))
}
var a = Singelation.getInstance("a");
var b = Singelation.getInstance("b");
console.log(a === b);
普通的一個(gè)單例(閉包實(shí)現(xiàn))
var Singelation = (function(name){
var instance = null;
return {
getInstance : function(){
return instance || (instance = 1); //此處的1是假象的實(shí)例,我認(rèn)為這個(gè)實(shí)例可以是任意值
}
}
})();
var a = Singelation.getInstance();
var b = Singelation.getInstance();
console.log(a == b);
用單例做個(gè)登錄框,假設(shè)一個(gè)頁(yè)面只有一個(gè)登錄框
var singelatonLogin = function(fn){
var instance = null;
return function(){
if(!instance){
var div = document.createElement("div"); //假裝這是一個(gè)登錄框
div.innerHTML = "登錄框";
document.body.prepend(div);
instance = div;
}
return instance;
}
}
var loginDiv = singelatonLogin();
上面的例子是可以實(shí)現(xiàn)登錄框的單例運(yùn)用,但是我能不能把單例方法做成一個(gè)載體,供其他類(lèi)似需求去用呢
var singelaton = function(fn){
var instance = null;
return function(){
return instance || (instance = fn.apply(this, arguments))
}
}
function loginDiv(html){
var div = document.createElement("div"); //假裝這是一個(gè)登錄框
div.style.display = 'none';
document.body.prepend(div);
return div;
}
//這里可以造一個(gè)登錄框單例,同樣可以造一個(gè)toast單例
var loginSingelaton = singelaton(loginDiv);
var loginDiv = loginSingelaton();
暢想:程序設(shè)計(jì)模式不是目的,解決實(shí)際的工作需求才是最終方向,單例模式可以返回的實(shí)例類(lèi)型可以很多,不要為了單例而單例,這過(guò)程中也可以做點(diǎn)別的。