单例模式。这种模式提供了一种将所有代码都组织到一个对象中的手段。它只能被实例化一次。
由于它只能被实例化一次,我们就可以确定所编写的所有代码用的都是相同的全局资源。
简单的来说,这种模式就是将很多很多代码封装在一个对象中,并规定对象只能被实例化一次。此对象的唯一实例应在任何地方都可以被访问。
用途,减少占用全局变量既的数目。组织自己的日常代码,方便以后维护。创建命名空间等等。
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 } } })();
通过这种方式创建,不但使得代码更精简,也使得更容易阅读。
好了,到此为止。整个单例模式的学习到此就结束了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript设计模式简单介绍之【单例模式的实现与优化】 - Python技术站