什么单例模式
定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问。
单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的window 对象等。在JavaScript 开发中,单例模式的用途同样非常广泛。试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。
实现单例模式
<script type="text/javascript">
var CreateDiv = function(html){
this.html = html;
this.init();
};
CreateDiv.prototype.init = function(){
var div = document.createElement(‘div‘);
div.innerHTML = this.html;
document.body.appendChild(div);
};
/*为了满足单一职责,这里引入代理*/
var ProxySingletonCreateDiv = (function(){
var instance;
return function(html){
if(!instance){
instance = new CreateDiv(html);
}
return instance;
}
})();
var a = new ProxySingletonCreateDiv(‘11‘);
var b = new ProxySingletonCreateDiv(‘22‘);
alert(a===b);
</script>
为了实现单一职责,引入代理实现了单例,CreateDiv作为一个普通的类,ProxySingletonCreateDiv负责完成单例
JavaScript中的单例模式
在java中,想要实现单例模式,需要先定义一个类,然后创建实例, 在以类为中心的语言中,这是很自然的做法,然而,JavaScript中并无类的概念,生搬硬套并无意义。单例模式的核心是确保只有一个实例,并提供全局访问,既然是要创建一个唯一的对象,为什么一定要创建一个“类”呢?
在js中创建唯一的对象很简单
var obj = {};
如果这句话放在全局作用域下,就满足了单例模式的两个条件。全局变量不是单例模式,但在开发中,我们经常会把全局变量当成单例使用。
但是全局变量很容易造成命名空间污染,在大型项目中,自己创建的对象很容被别人覆盖掉,所以开发中尽量少用全局变量,或者使用命名空间、闭包降低污染。
1.命名空间
<script type="text/javascript">
/*采用字面量创建*/
var std = {
foo: function(){
alert (1);
},
bar:{
str:‘hello world‘,
say:function(){
alert(this.str);
}
}
};
/*动态创建*/
var com = {};
com.namespace = function(name){
var current = com,
parts = name.split(‘.‘);
for(var i in parts){
if(!current[parts[i]]){
current[parts[i]] = {};
}
current = current[parts[i]];
}
};
com.namespace(‘demo‘);
com.namespace(‘dom.style.display‘);
console.log(com);
/*相当于*/
var com = {
demo: {},
dom: {
style: {
display:{
}}
}
};
</script>
2.采用闭包封装私有变量
<script type="text/javascript">
var user = (function(){
var __name = ‘sven‘,
__age = 29;
return {
getUserInfo: function(){
return __name + ‘-‘ + __age;
}
}
})();
</script>
我们用下划线约定私有变量,他们被封装在闭包作用于中,外部无法访问,从而避免了全局命名空间污染
惰性单例
时间: 2024-11-03 22:10:40