设计模式——单例模式

174 阅读1分钟

单例模式定义

保证一个类只有一个实例,并提供一个访问它的全局访问点。

一个普通的函数

function getSum() {
    return (1 + 100) * 50
}
console.log(getSum()) // 5050
console.log(getSum()) // 5050
console.log(getSum()) // 5050

这个函数每次执行都会重新运算。我们可以这样优化:

优化后的函数

我们使用result储存结果,这样就不需要每次都计算了。

let result;
function getSum() {
    if (result) {
        return result
    }
    result = (1 + 100) * 50;
    return result;
}
console.log(getSum()) // 5050
console.log(getSum()) // 5050
console.log(getSum()) // 5050

但是出现了两个变量result、getSum。还是会污染全局。我们继续优化:

再次优化(也叫惰性函数)

利用闭包+自执行函数,把result闭包在getSum中。这样就完美了。

const getSum = (function() {
    let result;
    function getSum() {
        if (result) {
            return result
        }
        result = (1 + 100) * 50;
        return result;
    }
    return getSum;
})()
console.log(getSum()) // 5050
console.log(getSum()) // 5050
console.log(getSum()) // 5050

单例在类中的实践

GetSum是类,proxyGetSum是代理函数,通过proxyGetSum让GetSum只调回一次

class GetSum{
    constructor() {
        this.result;
    }
    getSum() {
        if (this.result) {
            return this.result
        }
        this.result = (1 + 100) * 50;
        return this.result;
    }
}
const proxyGetSum = (function() {
    let result;
    function getInstance() {
        if (result) {
            return result
        }
        result = new GetSum();
        return result;
    }
    return getInstance;
})()
const instance1 = proxyGetSum();
const instance2 = proxyGetSum();
console.log(instance1 === instance2) // true

总结

看似很简单,但是单例模式对性能优化作用很大。对代码的运行提升很大。