单例模式经典应用:
如:window中的任务管理器,回收站等应用,一直都会维持一个仅有的实例,又如网站的计数器利用单例模式实现同步。
javascript单例模式:
1、懒汉式,即只有在需要创建对象实例的时候才会创建对象。
<script type="text/javascript">
var Singleton = (function(window){
var instance = null;
//任务管理器
//放在自执行函数中,避免外部直接通过new的方式创建对象
function TaskManager(){
this.count = 0;
}
//提供给外部接口,获取实例对象
function getInstance(){
if(instance === null) {
instance = new TaskManager();
}
return instance;
}
//扩展方法
TaskManager.prototype = {
constructor : TaskManager,
size : function(){
this.count++;
return this.count;
}
};
return {
getInstance:getInstance
};
})(window);
var instance = Singleton.getInstance();
alert(instance.size()); //1
var instance2 = Singleton.getInstance();
alert(instance2.size()); //2
</script>
代码中通过Singleton.getInstance();获取TaskManager实例对象,且TaskManager对象只会创建一次,且该实例对象共享。
所以instance2.size()会打印2.
且此时instance1 === instance2。
2.饿汉式单例模式实现,将先初始化实例对象,注意实例初始化的位置。
<script type="text/javascript">
var Singleton = (function(window){
var instance ;
function TaskManager(){
this.count = 0;
}
//提供给外部接口,获取实例对象
function getInstance(){
return instance;
}
//扩展方法
TaskManager.prototype = {
constructor : TaskManager,
size : function(){
this.count++;
return this.count;
}
};
//实例初始化
instance = new TaskManager();
return {
getInstance:getInstance
};
})(window);
var instance = Singleton.getInstance();
alert(instance.size());
var instance2 = Singleton.getInstance();
alert(instance2.size());
</script>
如果在第一步就var instance = new TaskManager();此时由于后续TaskManager重写了原型方法,新增了size()方法,如果写在之前,那么通过Singleton.getInstance()获取的TaskManager实例对象是不会存在size方法,这时会抛出instance.size()方法未定义异常。