# 🎉 单例模式

提示

单例模式其实在JS中是一个最简单、也是最常见的设计模式,它的含义也比较简单:保证一个类仅仅有一个实例,并且只提供一个访问它的全局访问点。这句话不好理解的话,给大家再举个栗子:我们使用CDN的方式在项目代码里引入的JS库文件,其实它的入口就是一个单例,比如我们的jQuery。当我们在页面中通过标签引入jQuery后,在JS代码里就可以使用"$"符号来访问jQuery里的所有方法了,这里的$符号其实就是jQuery对外提供的唯一访问点,也是jQuery

  • 一个实例只生产一次
  • 保证一个类仅有一个实例,并提供一个访问它的全局访问点

内容为个人理解的【Javascript设计模式】书籍

# 下面实现的一个简单的单例模式

需要使用方法 getInstance("xiaozhang"); getInstance("xiaoming");

根据单例模式的规则 不管new几次都会返回第一个new的 xiaozhang 下面来实现代码。


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

  Singleton.prototype.getName = function (params) {
    console.log(this.name)
  }

  function getInstance(name) {
    if (!this.instance) {
      this.instance = new Singleton(name)
    }
    return this.instance
  }

  console.log(getInstance("xiaozhang")) //返回xiaozhang
  console.log(getInstance("lisi")) //返回xiaozhang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

上面就是一个很简单的单例模式的代码,代码目前看起来没什么问题,但是这样单独定义一个getInstance用来做if判断不是很友好,那么可以使用闭包来优化一下代码。

# 最终的解决方案


// 利用闭包特性,new以后生成的this赋值给instance 并且把this提供给下一次new来调用
// 当然代码中也可以增加是否使用new来创建函数的判断。 增加代码new.target就好
  const Singleton = (function(){
    let instance;
    return function (name) {
      if (!instance) {
        instance = this
        this.name = name
      }
      return instance
    }
  })()

  console.log(new Singleton("xiaozhang"))
  console.log(new Singleton("4234"))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 策略模式比较简单。

在js中可以理解为 new多次 只返回第一次new的内容

lastUpdate: 7/27/2022, 9:01:42 AM