單例模式(Singleton Pattern)
什么是單例模式
單例模式甫煞,是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例的特殊類(lèi)冠绢。通過(guò)單例模式可以保證系統(tǒng)中抚吠,應(yīng)用該模式的一個(gè)類(lèi)只有一個(gè)實(shí)例。即一個(gè)類(lèi)只有一個(gè)對(duì)象實(shí)例弟胀。
把一堆代碼放入一個(gè)邏輯單元楷力,可通過(guò)一個(gè)單一的變量來(lái)訪問(wèn)。
單例模式最大的好處是封裝代碼孵户,減少全局變量萧朝。
var btn = document.querySelector('#btn')
btn.onclick = function() {
render()
}
function render() {
console.log('render')
}
用單例模式,把一坨代碼代碼整合到一個(gè)對(duì)象里夏哭,作為它的屬性和方法检柬。只保留一個(gè)全局變量,通過(guò)預(yù)留的“入口”啟動(dòng)
var app = {
btn: document.querySelector('#btn'),
init: function() {
this.bind()
},
bind: function() {
var _this = this
this.btn.onclick = function() {
_this.render()
}
},
render() {
console.log('render jirengu.com')
}
}
app.init()
使用閉包竖配,來(lái)隱藏部分不需要暴露的變量何址,只暴露出init方法酱固。這種特殊的單例模式也叫模塊模式(module pattern)
var app = (function(){
var btn = document.querySelector('#btn')
function bind() {
btn.onclick = function() {
render()
}
}
function render() {
console.log('render jirengu.com')
}
return {
init: function() {
bind()
}
}
})()
app.init()
改進(jìn), 不立即創(chuàng)建實(shí)例,等需要的時(shí)候再創(chuàng)建头朱。
var Singleton = (function(){
var instance
function createInstance() {
// code here
return {a: 1, b:2}
}
return {
getInstance: function() {
if(!instance) {
return createInstance()
}
return instance
}
}
})()
var instance1 = Singleton.getInstance()
var instance2 = Singleton.getInstance()
console.log(instance1 === instance2)
完整代碼
var Singleton = (function(){
var instance
function createInstance() {
var btn = document.querySelector('#btn')
function bind() {
btn.onclick = function() {
render()
}
}
function render() {
console.log('render Singleton')
}
return {
init: function() {
bind()
}
}
}
return {
getInstance: function() {
if(!instance) {
return createInstance()
}
return instance
}
}
})()
var app = Singleton.getInstance()
app.init()