likes
comments
collection
share

js性能优化之单例模式

作者站长头像
站长
· 阅读数 20

概念

在设计模式中,单例模式是一种常用的对象创建型模式,其核心在于确保一个类只有一个实例,并提供一个全局访问点。换句话说,无论何时何地,无论通过何种方式调用该类,都只能返回同一个实例。

使用场景

在实际开发中,我们经常需要使用一些全局唯一的对象,比如数据库连接、线程池、缓存等。如果这些对象被多次实例化,不仅会占用过多的内存资源,而且可能会导致数据不一致的问题。因此,我们需要使用单例模式来保证这些对象的唯一性。

如何实现单例模式

在JavaScript中,我们可以使用函数、闭包和模块等方式来实现单例模式。下面,我将通过一个简单的例子来说明如何使用函数和闭包实现单例模式。

function Singleton() {
    this.name = "Singleton";
}

Singleton.prototype.getName = function() {
    return this.name;
};

let instance;

function getInstance() {
    if (!instance) {
        instance = new Singleton();
    }
    return instance;
}

let singleton1 = getInstance();
let singleton2 = getInstance();

console.log(singleton1 === singleton2); // true

在这个例子中,我们首先定义了一个Singleton类,然后定义了一个getInstance函数。这个函数会检查是否已经存在一个Singleton的实例,如果不存在,就创建一个新的实例;如果已经存在,就直接返回这个实例。这样,无论我们调用多少次getInstance函数,都只会返回同一个Singleton的实例。

实际案例

这有一个非常好的单例模式应用,这里我们创建了一个storage类,用来封装对浏览器localStorage的操作。我们使用了静态方法getInstance来确保无论何时调用,都只返回同一个storage实例。下面是更详细的解释:

Javascript
深色版本
class storage {
    // 使用静态属性来保存实例
    static instance = null;

    // 静态方法,用于获取单例
    static getInstance() {
        // 如果还没有实例,就创建一个新的
        if (!storage.instance) {
            storage.instance = new storage();
        }
        // 返回实例
        return storage.instance; 
    }

    // 用于从localStorage获取数据的方法
    getItem(key) {
        return localStorage.getItem(key);
    }

    // 用于向localStorage设置数据的方法
    setItem(key, value) {
        localStorage.setItem(key, value);
    }
}

在使用这个storage类时,我们只需要调用storage.getInstance()来获取实例,然后就可以使用getItemsetItem方法来操作localStorage了。例如:

Javascript
深色版本
1const s1 = storage.getInstance();
2s1.setItem('name', 'John');
3console.log(s1.getItem('name')); // 输出: John
4
5const s2 = storage.getInstance();
6console.log(s2.getItem('name')); // 输出: John

可以看到,无论我们调用多少次getInstance方法,得到的都是同一个storage实例,这就体现了单例模式的核心思想:确保一个类只有一个实例,并提供一个全局访问点。

总结

单例模式是设计模式中的一种,它可以保证一个类只有一个实例,并提供一个全局访问点。在JavaScript中,我们可以通过函数、闭包和模块等方式来实现单例模式。希望这篇文章能帮助你更好地理解和使用单例模式。

以上就是关于JavaScript中单例模式的介绍,如果你有任何问题或建议,欢迎在评论区留言。

转载自:https://juejin.cn/post/7388347353406816293
评论
请登录