likes
comments
collection
share

只做你的唯一 ,JS中的单例模式的详细解析

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

前言

单例模式是一种广泛应用于软件工程中的设计模式,属于创建型模式的一种。它的核心目的是确保一个类在整个系统中仅有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种设计模式常用于那些需要频繁创建和销毁的对象管理,通过限制实例数量来节省系统资源,减少性能开销,同时保证对共享资源的控制更加集中和协调。

正文

例如: 只做你的唯一 ,JS中的单例模式的详细解析 在你未登入时,你点击登入,或者点赞,收藏等操作时,由于未登入,页面会弹出登入窗口,可是如果一直反复申请后台动态数据,对于前端的加载速度和服务器的请求压力都是有着巨大的压力,这时候就需要用到单例模式,可以通过管理全局状态、配置、资源和服务初始化等,为用户提供基础的服务保障,并为后续的登录过程及登录后的功能体验打下基础。

单例模式基本实现1

var Singleton = (function () {
    var instance = null;

    function Singleton() {
        if (instance) {
            return instance;
        }
        
        this.publicMethod = function () {
            console.log("创建单例");
        };

        instance = this;
        return this;
    }

    return Singleton;
})();
// 使用单例
    var singleton1 = new Singleton();
    singleton1.publicMethod(); // 输出: 创建单例
    var singleton2 = new Singleton();
// singleton1 和 singleton2 指向相同的实例
    console.log(singleton1 === singleton2); // 输出: true

在理解中是不是想,两个实例化对象怎么会相等,就算值一样也是不应该相等的啊对吧? 这里我先上个图解给大家解析一下:

只做你的唯一 ,JS中的单例模式的详细解析

在初次实例化之前,由于函数未被调用过,此时的函数的this是指向全局的,这里由于有关this指向的,我后买你会发文章讲解,可以留一手关注。

在初次实例化的时候,由于instan为空,所以会实例化对象this将指向实例化的对象,并返回给singleton1

在第二次实例化的时候,由于instan不为空了,所以new singleton并不会再创建新的对象来返回给singleton2,而是将第一次实例化singleton的对象地址返回给singleton2。

这个例子是使用闭包来实现了

单例模式基本实现2

下面我再用一个例子来实现单例模式:

  const singleton=function (name){
  this.name=name
  this.instance=null
}
singleton.prototype.getName=function(){
  console.log(this.name)
}

  //静态方法
singleton.getInstance=function(){
  if(!this.instance){
    //静态属性
    this.instance=new singleton()
  }
  return this.instance
}
//创建user1
let user1=singleton.getInstance("user1")
let user2=singleton.getInstance("user2")
console.log(user1===user2)//true
user1.getName()//user1
user2.getName()//user1

这里我创建定义了一个构造函数singleton,它接受一个参数name,并将其作为实例的name属性。同时,它内部也定义了一个instance属性,但在这个上下文中直接在构造函数内定义instance并不是必需的,因为静态方法getInstance将会管理这个唯一实例。

user1user2都是通过调用singleton.getInstance也是方法创建的。当user1的在被创建时instance为空,后面user2使用singleton.getInstance返回instanc的内存位置。

所以在输出uesr2.name时,输出的却是“user1”。

总结

单例模式作为一种设计模式,确保了系统中特定类只有一个实例,并提供全局访问点以获取该实例,有利于资源管理和优化性能。在实际场景如登录控制、日志系统、数据库连接池中,单例模式通过限制实例数量降低系统负担,实现资源高效利用。实现上,可通过闭包或静态方法确保实例的唯一性,如示例代码所示,无论是通过立即执行函数还是构造函数加静态方法的方式,都确保了多次实例化请求返回相同对象实例,体现了单例的核心特征。

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