JS设计模式 - 单例模式

320 阅读1分钟

何为单例模式

将一堆代码放入一个逻辑单元(对象),通过单一的变量来访问。

其优点是封装代码,减少全局变量

示例

例如,要实现点击一个元素,执行某个操作的应用

原始写法:

const btn = document.querySelector('#btn')
btn.onclick = function(){render()}
function render(){/* ... */}

这样很容易出现过多全局变量,难以维护。

使用单例模式:

将应用封装为一个对象,只保留一个全局变量

const app = {
    init(){
        this.btn = document.querySelector('#btn')
        this.bind()
    },
    bind(){
        this.btn.onclick = ()=>{
            this.render()
        }
    },
    render(){
        //...
    }
}

app.init()

利用闭包:

利用闭包,隐藏变量,只暴露init方法,这种特殊的单例模式也叫模块模式

const app = (function(){
    const btn = document.querySelector('#btn')
    function bind(){
        btn.onclick = function(){render()}
    }
    function render(){/* ... */}
    
    return {
        init(){bind()}
    }
})()

app.init()

【改进】不立即创建app实例,等到需要时再创建。

const App = (function(){
    let instance
    function createInstance(){/* 以上app的代码 */}
    return function(){
        if(!instance){
            instance = createInstance()
            return instance
        }
        return instance
    }
})()

const app = App()
app.init()