Javascript设计模式学习二(单例)
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点
普通的单例模式:
使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象。
比如:使用一个变量instance标记是否创建了这个类对象,现在需要用到一个Single类,先判断instance是否为null,若不是则直接return返回,若是则new Singleton();
var instance = null; return function(){ if(!instance){ instance = new Singleton(); } return instance; }
JavaScript中,我们经常会把全局变量当成单例来使用,但全局变量容易造成命名空间污染,使用命名空间可以减少全局变量的数量。
我们常在管理命名空间时使用单例模式,它可以降低你在代码中创建全局变量的数量。
惰性单例:在需要的时候才创建对象实例。(非常有用)
通用的惰性单例:
首先是管理单例逻辑封装在getSingle中,创建对象的方法fn被当作参数动态传入
var getSingle = function(fn){ var result; return function(){ return result || (result = fn.apply(this,arguments)); } };
fn可以是创建弹窗的方法createDialog或者其他方法,传入getSingle后,返回一个新的函数,并且用一个变量result保存fn的结果,因为result在闭包中,所以它永远不会被销毁,如果result已经被赋值,那么它将返回这个值。
var createDialog = function(){ //创建Dialog代码 } document.getElementById("btn").onclick = function(){ var dialogLayer = getSingle(createDialog);//这样创建好Dialog了 }
把创建实例对象和管理对象分别放置在两个方法里,这两个方法可以独立变化而互不影响,减低耦合。这两个方法组合起来才具有单例模式的神奇作用
这种单例模式的用途不止创建对象,可以用于“一次绑定事件”,还有其他。。