现在的位置: 首页 > 综合 > 正文

javascript设计模式简单介绍之【单例模式的实现与优化】

2013年01月29日 ⁄ 综合 ⁄ 共 1333字 ⁄ 字号 评论关闭

单例模式。这种模式提供了一种将所有代码都组织到一个对象中的手段。它只能被实例化一次。

由于它只能被实例化一次,我们就可以确定所编写的所有代码用的都是相同的全局资源。

简单的来说,这种模式就是将很多很多代码封装在一个对象中,并规定对象只能被实例化一次。此对象的唯一实例应在任何地方都可以被访问。

用途,减少占用全局变量既的数目。组织自己的日常代码,方便以后维护。创建命名空间等等。

function myMode(){
  //定义一个单例模式对象
}
myMode.prototype = {//为其添加方法和属性
  'arg1':'argument1...',
  'init':function(){
    //code...
  }
}
var mode = new myMode();//创建一个单例模式实例

以上便是一个简单的单例模式,它与我们平常看到的定义一个对象并生成它的实例似乎没什么区别。

当然,它还不是一个完全的单例模式。

因为由于javascript的特性使然,它的属性以及方法是可以被删除和修改的。

但是这违背了面向对象设计的原则,类可以被扩展,但是不能被修改。对于这一点,目前还没有比较好的解决办法。(如果有希望各位不吝赐教~拜谢。)

还有就是,我们无法保证它只被实现了一次。但是我们可以通过一点小手段来保证它只被实现一次。 

到此,整个单例模式也就基本要结束了。当然,上面那段代码,并不是严格意义上的单例模式、

下次将会为继续优化它,使它看起来比较像一个真正的单例模式。

 

昨天简单的介绍了单例模式的基本实现方式,下面将继续学习如何优化它。

首先,为了保证单例模式只能被实例化一次,我们可以将它放在一个自执行的匿名函数中。

var mode = (function(){
  function myMode(){
    
  }
  myMode.prototype
= {     'arg1':'argument1....',     'init':function(){         //code     }   }      return new myMode() })();

 

这段代码与上面的代码得到的结果,是一模一样的。

不过将myMode放在了一个自执行的匿名函数中,使得在window中无法访问它。

在匿名函数中,我们返回了它生成的一个实例。当匿名函数结束时,mode得到它的实例的引用。

而在window下将无法在访问myMode。使得它只能被实例一次。这时它离我们期望达到的目的又进了一步。

大家都知道javascript中对象的声明有多种形式,在这个单例的内部我们采用的是最常规的一种,通过new关键字创建的。

然而这种方式并不适合单例模式,因为我们并不需要创建多个实例。为此而定义一个class显然是不值得的。

下面我们将采用{}的方式来创建一个对象,这种方式将更加适用于单例模式,也使得代码更容易被阅读。

 

var mode = (function(){
  return {
    'arg1':'argument1...',
    'init':function(){
      //code
    }
  }
})();

通过这种方式创建,不但使得代码更精简,也使得更容易阅读。

好了,到此为止。整个单例模式的学习到此就结束了。

抱歉!评论已关闭.