JavaScript设计模式(单例)

单例模式

单例模式,又称单体模式,定义为产生一个类的唯一实例。运用单例模式,能够很好的将代码划分为一个个命名空间,同时也减少了变量对全局命名空间的污染。通常是基于某个功能模块,创建一个单例对象,这样能够良好的将该功能模块代码与其他功能模块代码隔离

最常见,最简单的的单例模式就是对象字面量

1
2
3
4
5
6
7
var singleton = {
attribute1: 'hello',
attribute2: 'world',
method: function () {
console.log('This is a singleton example')
}
}

通过只将一个对象变量暴露在全局变量中,其余的属性和方法都添加在这对象上,减少了变量对全局变量的污染,同时也将代码划分到一个个不同的命名空间中。
此外,还可以与闭包结合,实现拥有私有变量的单例对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var Singleton = (function () {
var instance;
function initInstance () {
var object = new Object();
object.msg = "Singleton instance";
return object;
}
return {
getInstance: function () {
if(!instance) {
instance = initInstance();
}
return instance;
}
};
})();
var instance1 = Singleton.getInstance();
var instance2 = Singleton.getInstance();
instance1 === instance2; // true

上述产生的实例都是同一个。

在日常,我更喜欢这样写单例模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(function() {
var singleton, _self;
singleton = _self = {
// 数据
data: {
url: 'someurl'
},
// 原素
elem: {
someElem: document.getElementById('#someElem'),
jQueryElem: $('#jQueryElem')
},
bind: function () {
_self.elem.someElem.onClick = function() {
}
},
fns: {
method: function () {
console.log(_self.data.url)
}
},
init: function () {
_self.bind();
}
}
singleton.init();
})();

坚持原创技术分享,您的支持将鼓励我继续创作!