单例模式下每次获取的都是同一个实例。符合单一职责原则,只实例化唯一的对象,在系统中会被唯一使用。
应用 :
- 购物车
- 登录框
- jQuery 只有一个 $,即使页面中引用了很多个 jQuery 那也只有一个 $
- 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