單例模式是一個用來劃分命名空間并將一批屬性和方法組織在一起的對象酱讶,如果它可以被實例化,那么它只能被實例化一次。
原文鏈接
單例模式優(yōu)點
- 劃分命名空間梳杏,減少全局變量
- 組織代碼為一體棺聊,便于閱讀維護
并非所有的對象字面量都是單例伞租,比如模擬數(shù)據(jù)
基本結(jié)構(gòu):
let Cat = {
name: 'Kitty',
age: 3,
run: ()=>{
console.log('run');
}
}
上面對象字面量結(jié)構(gòu)是創(chuàng)建單例模式的方法之一,但并不是單例模式限佩,單例模式的特點是僅被實例化一次
要實現(xiàn)單例模式可以使用變量來標示該類是否被實例
基本實現(xiàn):
class Singleton {
constructor(name){
this.name = name;
this.instance = null;
}
getName(){
return this.name;
}
}
let getInstance = (()=> {
let instance;
return (name)=> {
if(!instance) {
instance = new Singleton(name);
}
return instance;
}
})()
let cat1 = getInstance('Hello');
let cat2 = getInstance('Kitty');
console.log(cat1 === cat2); //true
console.log(cat1.getName()) //'Hello'
console.log(cat2.getName()) //'Hello'
用instance變量標示實例Singleton葵诈,如果沒有實例創(chuàng)建一個,如果有則直接返回實例祟同,由于僅能被實例化一次作喘,cat2得到的實例和cat1相同
實用
在創(chuàng)建dom元素時為避免重復創(chuàng)建,可以使用單例模式創(chuàng)建
//單例模式
let createModal = function() {
let content = document.createElement('div');
content.innerHTML = '彈窗內(nèi)容';
content.style.display = 'none';
document.body.appendChild(content);
}
//代理獲取實例
let getInstance = function(fn) {
let result
return function() {
return result || (result = fn.call(this,arguments));
}
}
let createSingleModal = getInstance(createModal);
document.getElementById("id").onclick = function(){
let modal = createSingleModal();
modal.style.display = 'block';
};
單例模式是一種簡單卻非常使用的設計模式晕城,在需要時創(chuàng)建實例泞坦,并且只創(chuàng)建唯一一個