# 单例模式
# 题目
设计一个类,我们只能生成该类的一个实例
# 概念
单例模式的核心是确保只有一个实例,并提供全局访问
其实在JavaScript中,单例模式并没有这么复杂,因为我们没有类,既然我们只要一个唯一的对象,为什么要创建“类”呢
var a = {}
我们这样创建了对象a,它确实独一无二 ,而且满足了单例模式的两个条件
- 一个实例
- 全局访问
但是全局变量很容易造成命名空间污染,如果项目很大的话,不小心覆盖了变量那就是致命的
# 适用场景
- 弹框的实现,全局缓存
- 遮罩层
# 代码
//获取单例
var getSingle = function(fn){
var result;
return function (){
return result || (result=fn.apply(this,arguments));
};
};
// 创建遮罩层
var createMask = singleton( function(){
return document.body.appendChild( document.createElement('div') );
})
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
调用 getSingle(createMssk)
通用的单例创建的例子就是通过封装一个getSingle
需要实现单例模式的对象。而且只是会只创建一次。因为使用了 闭包的原因通过getSingle
创建的result
会在内存中一直存在不会销毁(除非页面关闭,或者手动释放)。
# 总结
单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对像,并且只创建唯一的一个。更奇妙的是,创建对象和管理单例的职责被分布在两个不同的方法中,这两个方法组合起来才具有单例模式的威力。