创造型设计模式之单例模式

85 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

楔子

为什么要使用设计模式?

日常业务开发过程中,即使开发者不使用任何设计模式,依然可以实现业务功能。既然如此,我们为什么要花费时间来了解设计模式并使用呢?

首先,设计模式可以让我们书写出美观且结构合理的代码;其次,设计模式是一种行之有效的方案,可以帮助我们快速的实现业务,而不是为了实现需求的代码堆砌;最后,设计模式其实也是一种最佳实践,是开发者所追求的理想模式。

单例模式又是什么呢?

单例模式又被称为单体模式,是只允许实例化一次的对象类,并且提供可全局访问点。

大家可能对单例模式没什么概念,但是,日常开发过程中大家可能都使用过单例模式。在ES6之前,JavaScript其实没有类的概念,只是通过命名和函数实现的时候来模拟实现。所以,在JavaScript中,单例模式的最大特点就是“单一”和“全局”

单例模式的特性

命名空间

单例的最大特性就是创建了一个命名空间,我们可以通过命名空间来访问内部的变量和方法。例如我们之前常用的JQuery库就使用了单例模式。

按照这个特性,我们就可以来实现一个简单版的单例模式了。

    function Singleton (name = 'Singleton') {
        this.name = name;
        this.instance = null;
    }
    
    Singleton.prototype.getName = function () {
        return this.name;
    }
    
    Singleton.prototype.getInstance = function (name) {
        if (this.instance) {
            return this.instance;
        }
        
        return this.instance = new Singleton(name);
    }

模块化

单例模式除了创建了一个命名空间之外,还将代码划分为一个个代码块来进行代码管理。在ES6中的module其实也可以理解为一种变相的单例模式。

单例模式实践

标配版单例模式

我们借助闭包的方式来实现单例模式。如果实例已存在的话,直接返回实例;如果实例不存在的话,就先创建实例,然后再返回创建的实例。

    const Singleton = (function(){
        let instance = null;
        
        return function(name){
            if(instance){
                return instance
            }
            return instance = new Singlton(name);
        }
    })();

这种单例模式是运行时立马执行,即使当前我们并没有使用到这个实例。

高配版惰性单例

为了优化初始化时的开销,我们有时候没必要立马执行单例,可以延迟创建,这时候我们就可以使用惰性单例了。这样的好处就是提高我们的初始化性能,可以让页面更快的渲染出来。

    const LazySingleton = function() {
        let _instance = null;
        
        return function () {
            if (!_instance) {
                _instance = new Single();
            }
            
            return _instance;
        }
    }

终章

好了,有关单例模式的实践我们就聊这么多,如果大家有什么想要聊的,可以在下方进行留言交流。