1 单例模式
定义:是能被实例化一次的类或者对象(只能存在一个)
特点:
只允许实例化一次的对象类
对于十分复杂的对象类,往往可以节省资源占用
通常也被用来管理命名空间
作用:管理命名空间,管理数据,方法的存储
应用:
一些代码库中命名空间就是通过单例模式实现的
管理数据的存储,例如模拟静态变量
<script>
// 定义,只能实例化一次
// 有时候不允许外界访问
// 放在闭包中
var single = (function() {
// 定义类
function Demo() {
console.log('实例化了');
this.msg = 'hello';
// 省略1万行
}
// 方法
Demo.prototype.getMsg = function() {
console.log(this.msg);
}
// 省略1万行
// 存储类实例化对象
var instance = new Demo();
// 暴露接口
return function() {
// 返回实例
return instance;
};
})()
程序执行的时候会实例化一次,并且存储在instance中,并把函数function(){return instance}返回给single
然后执行single的时候var s1 = single();,会把实例化后的对象返回给s1
var s1 = single();
var s2 = single();
console.log(s1, s2);
</script>
上面这种单例模式在程序开始执行的时候就会实例化一次,下面这种方式,只有在执行var s1 = single();的时候才会实例化
2 惰性单例
定义:延迟单例类的实例化时间
作用:如果单例类实例化开销很大,页面加载时候,有很多业务逻辑需要执行,并不需要这个单例类,此时我们可以推迟这个单例类的实例化时间
实现:
1 通过闭包将惰性类封闭起来,避免外界的访问
2 在闭包的返回函数中,我们判断闭包类有没有实现
没有实现再去实例化
实现了直接返回
3 当调用这个闭包时候,才尝试去实例化,这样就拖延了实例化的时间点
<script>
// 定义,只能实例化一次
// 有时候不允许外界访问
// 放在闭包中
var single = (function() {
// 定义类
function Demo() {
console.log('实例化了');
this.msg = 'hello';
// 省略1万行
}
// 方法
Demo.prototype.getMsg = function() {
console.log(this.msg);
}
// 定义单例
var instance;
// 暴露接口
return function() {
// 判断单例是否被实例化了
if (instance) {
return instance;
} else {
// 重新实例化并返回
只有执行single();的时候并且没有被实例化过的时候才会实例化一次
instance = new Demo();
return instance;
}
};
})()
var s1 = single();
var s2 = single();
console.log(s1, s2);
</script>