文档详情

javascript设计模式之单例模式.docx

发布:2018-02-01约6.42千字共11页下载文档
文本预览下载声明
javascript设计模式之单例模式单例模式是指保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是一种常用的模式,有一些对象往往只需要一个,比如线程池、全局缓存、浏览器中的window对象等。在javaScript开发中,单例模式的用途同样非常广泛。试想一下,单击登录按钮时,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。标准单例要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。代码如下:var Singleton = function( name ){ = name; this.instance = null;};Stotype.getName = function(){ alert ( );};Singleton.getInstance = function( name ){ if ( !this.instance ){ this.instance = new Singleton( name ); } return this.instance;};var a = Singleton.getInstance( sven1 ); var b = Singleton.getInstance( sven2 );alert ( a === b ); // true或者:var Singleton = function( name ){ = name;};Stotype.getName = function(){ alert ( );};Singleton.getInstance = ( function(){ var instance = null; return function( name ){ if ( !instance ){ instance = new Singleton( name ); } })(); } return instance;通过Singleton.getInstance来获取Singleton类的唯一对象,这种方式相对简单,但有一个问题,就是增加了这个类的“不透明性”,Singleton类的使用者必须知道这是一个单例类,跟以往通过new XXX的方式来获取对象不同,这里偏要使用Singleton.getInstance来获取对象虽然已经完成了一个单例模式的编写,但这段单例模式代码的实际意义并不大。透明单例现在的目标是实现一个“透明”的单例类,用户从这个类中创建对象时,可以像使用其他任何普通类一样。在下面的例子中,将使用CreateDiv单例类,它的作用是负责在页面中创建唯一的div节点,代码如下:var CreateDiv = (function () { var instance; var CreateDiv = function (html) { if (instance) { return instance; } this.html = html; this.init(); return instance = this; }; CreateDtotype.init = function () { var div = document.createElement(div); div.innerHTML = this.html; document.body.appendChild(div); }; return CreateDiv; })(); var a = new CreateDiv(sven1); var b = new CreateDiv(sven2); alert(a === b); // true虽然现在完成了一个透明的单例类的编写,但它同样有一些缺点。为了把instance封装起来,使用了自执行的匿名函数和闭包,并且让这个匿名函数返回真正的Singleton构造方法,这增加了一些程序的复杂度,阅读起来也不是很舒服。上面的代码中,CreateDiv构造函数实际上负责了两件事情。第一是创建对象和执行初始化init方法,第二是保证只有一个对象。这是一种不好的做法,至少这个构造函数看起来很奇怪。假设某天需要利用这个类,在页面中创建千千万万的div,即要让这个类从单例类变成一个普通的可产生多个实例的类,那必须得改写CreateDiv构造函数,把控制创建唯一对象的那一段去掉,这种修改会带来不必要的烦恼。代理实现单例现在通过引入代理类的方式,来解决上面提到的问题。依然使用上面的代码,首先在CreateDiv构造函数中,把负责管理单例的代码移除出去,使它成为一个普通
显示全部
相似文档