一、介绍

  • 系统中被唯一使用
  • 一个类只有一个实例
  • 单例类必须自己创建自己的唯一实例

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
解决问题:一个全局使用的类频繁的创建与销毁。
如何解决(实现思想):判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
注意:构造函数是私有的。单例模式实例出来的对象是完全一样的

二、事例

  • 登录框(无论项目多么复杂,也只有一个登录框)
  • 购物车(一个商场网站也只有一个购物车)

    三、UML类图

    四、代码演示

    ```javascript class SingleObject { login () {
    1. console.log('login ....')
    } } // 编写静态方法 // 不在SingleObject方法里面写,就是想要getInstance不发生改变,无论new多少次,getInstance方法都是一样的 SingleObject.getInstance = (function () { let instance return function () {
    1. if (!instance) {
    2. instance = new SingleObject()
    3. }
    4. return instance
    } })() 注意:写一个自执行函数就是要造成闭包,外面的不能访问内部的变量,避免变量在全局下,造成变量污染

// 测试 let obj1 = new SingleObject.getInstance() obj1.login() let obj2 = new SingleObject.getInstance() obj2.login()

console.log(‘obj1===obj2’, obj1 === obj2) // true // 单例模式,就是两个对象完全一样,===也是true // 是真正的单例,也是唯一的实例

// 注意:如果是直接new SingleObject()也不会报错,但是和原来的就不是一个对象了 console.log(‘———分割线———-‘) let obj3 = new SingleObject() console.log(‘obj1===obj3’, obj1 === obj3) // false ```

五、应用场景

1、jq中只有一个$

2、Vuex、Redux中的store

六、总结