万万哇 发表于 2022-8-9 14:43:24

前端设计模式(一):单例模式

​                单例模式就是保证类的实例只有一个,这就是它的作用,比如在前端中,创建全局唯一的对话框实例,记录日志信息全局唯一实例等等。
单例模式在前端的两种实现方式:

1.通过原型方法实现
const Singleton = function () {
    this.instance = null;
};
Singleton.getInstance = function (name) {
    if (!this.instance) {
      this.instance = new Singleton();
    }
    return this.instance;
};
const a = Singleton.getInstance();
const b = Singleton.getInstance();
console.log(a === b); // true2.通过静态方法实现
class SingleDog {

static instance;

show() {
    console.log('我是一个单例对象')
}
static getInstance() {
    // 判断是否已经new过1个实例
    if (!SingleDog.instance) {
      // 若这个唯一的实例不存在,那么先创建它
      SingleDog.instance = new SingleDog()
    }
    // 如果这个唯一的实例已经存在,则直接返回
    return SingleDog.instance
}
}
const s3 = SingleDog.getInstance()
const s4 = SingleDog.getInstance()
console.log(s3 === s4); // true实际上,上面两种方法模仿的是Java语言中的单例实现方式,平常我们前端开发,基于ES6使用模块导入导出,也可以看作单例模式:
// 比如这是SingletonExample.js
// 可以定义一些属性,方法等等,然后通过export导出,其他模块再分别导入

const array_state = [];

const methodTest = function() {
    console.log('这是测试方法')
}

export default {
    array_state, methodTest
}单例模式的应用场景:

1.利用单例模式思想 来实现 登录框的 显示和隐藏
class LoginForm {
    constructor(){
      this.state = 'hide'
    }
   
    show(){
      if(this.state === 'show'){
            console.log('已经显示');
            return
      }
      this.state = 'show';
      console.log('登录框已显示')
    }
   
    hide(){
      if(this.state === 'hide'){
            console.log('已经隐藏');
            return
      }
      this.state = 'hide';
      console.log('登录框已隐藏')
    }
}

LoginForm.getInstance = (function(){
    let instance
    return function() {
      if(!instance){
            instance = new LoginForm();
      }
      return instance
    }
})测试:
let login1 = LoginForm.getInstance();
login1.show(); //打印:登录框显示成功


let login2 = LoginForm.getInstance();
login2.hide(); //打印:登录框隐藏成功

console.log(login1 === login2)其他的应用场景例如,vuex,redux中的store都是单例模式实现的
关于单例模式的思考:

​                其实,在前端使用Vue,React等框架开发时,很难再去使用传统的单例模式,因为ES6的导入导出不仅写法优雅,而且编码使用都比传统的书写方式方便。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 前端设计模式(一):单例模式