单例模式

单例模式下每次获取的都是同一个实例。符合单一职责原则,只实例化唯一的对象,在系统中会被唯一使用。

应用 :

  1. 购物车
  2. 登录框
  3. jQuery 只有一个 $,即使页面中引用了很多个 jQuery 那也只有一个 $
  4. vuex和redux中的store也是单例模式

举例一:

class SingleObject {
    //这里的login方法不是静态方法,每初始化一个实例时,实例都会有自己的login方法
    login() {
        console.log('login');
    }
}

//给类定义一个静态方法,这个静态方法不管类被实例化多少个,都只有这一个静态方法
//这里的自执行闭包函数是为了避免全局变量污染,在闭包里面定义了一个instance变量,将instance变量定义在外部会污染全局变量
SingleObject.getInstance = (function () {
    //闭包中返回唯一被初始化的实例
    let instance;
    return function () {
        if (!instance) {
            instance = new SingleObject();
        }
        return instance;
    }
})();

let obj1 = SingleObject.getInstance();
let obj2 = SingleObject.getInstance();

obj1.login(); //login
obj2.login(); //login
//单例模式下每次获取的都是同一个,所以这里的obj1和obj2完全相等
console.log(obj1 === obj2); //true

举例二:

//登录框演示
class LoginForm {
    constructor() {
        this.show = 'hide';
    }
    showF() {
        if (this.show == 'show') {
            console.log('已经显示');
            return;
        }
        this.show = 'show';
        console.log('显示完毕');
    }
    hide() {
        if (this.show == 'hide') {
            console.log('已经隐藏');
            return;
        }
        this.show == 'hide';
        console.log('隐藏成功');
    }
}

LoginForm.getInstance = (function () {
    let instance;
    return function () {
        if (!instance) {
            instance = new LoginForm();
        }
        return instance;
    }
})();

let f1 = LoginForm.getInstance();
let f2 = LoginForm.getInstance();

f1.showF();
f2.showF();
console.log(f1 === f2);
// 显示完毕
// 已经显示
// true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值