Pro javasctipt读书笔记之singleton pattern之一
2008-09-27 14:48 wlstyle 阅读(261) 评论(0) 收藏 举报单一设计模式(the singleton pattern)是在javascipt中一种最基础但却是最有用的设计模式。
1.单一设计模式的基本结构(the basic structure of the singleton)
在这个例子中,所有的成员都可以通过Singleton这个变量进行访问。你能通过点号(.)访问他们。
这个单一对象Singleton对象可以被修改,你能为他添加新的成员。就像和其他对象一样。同样你也可以删除对象中的成员(使用delete关键字),这些违反了面向对象设计的一个原则:类应该被扩展而不应该被修改。但是这些做法在javascrpt中是正确的,这是正是一种javascrpt和其他面向对象语言如C++和java不同的方式。你不必为使用了这种方式而担心。如果你确实需要保护某个变量,那么可以使用上一章提到的闭包,构建一个私有变量。
这样似乎没有明确一个单一的对象和普通的对象之间的区别。传统上对单一模式定义是这样的:某个类只能有一个实例,并且可以通过公开的访问点访问。如果严格的遵照定义,上面例子中不符合单一模式。因为他不可以被实例化。我们选择一个较为宽松的定义:它是一个命名空间并且集合一组相关的属性和方法的对象,如果他能被实例化,那么他只能实例化一次。
使用一个文字对象(object literal)只是一个创建Singlton的方法。本章将要介绍的其他方式使它更像其他面向对象语言的单一类。当然,不是所有的文字对象都是单一的,如果它简单地存储数据,很明显他不是Singleton。如果他用来集合一组相关的属性和方法,那么他可能是Singleton,区别主要取决与使用的目的(呵呵,好像区别不是很明确)。
2.命名空间(namespacing)
单一对象(singleton object)有两个部分组成:对象本身,包含的成员(包括属性和方法),和访问它的变量,这通常是一个全局变量。所以单一对象可以在页面中的任何地方访问。这是单一设计模式最重要的特点。他无需通过定义使之具有全局性。但是他确可以全局访问。这是因为所有的成员都包含在单一对象中。这些成员具有全局性。直观上来看,他们已经在singlton的命名空间中,因为他们只能通过singlton的变量才可以被访问。
命名空间是javascrpt中很大的一块可靠的设计。因为在javascript中everything都可以被重写(overwritten),这样可以很简单的消除一个变量,一个函数,或者是一个完整的类。这些类型的错误很费时间去发现。比如:
其中一个最好的避免无意间重写变量的方式就是使用singleton对象。可以重写上面的代码。
上述代码中findProduct函数是myNameSpace对象中的一个方法。这样就保护他以免在全局命名空间中定义。当时它依然是可以全局访问。不过访问的方式就要发生改变了。从findProduct(id),变为myNameSpace.findProduct(id);这样就可以让其他开发者知道这个方法是哪里定义的了。同时也知道了他所完成的任务。这样可以把类似的method集中到一个singleton中。
你可以更进一步,在今天的许多页面中,代码的来源有许多。可能有库代码,身份识别代码,以及其他你所写的代码,所有这些变量都存在一个全局的命名空间中,为了避免他们发生冲突,你可以把他们放在一个singleton变量中。
这样其他代码和此代码的冲突几率就减少了。如果冲突还是发生了,那么冲突发生的位置也是比较容易查找。这样就可以高枕无忧了,因为这样这种设计是可靠的,并没有把全局命名空间搞乱。你只是添加了一个单独的变量,这只是就像其他javascript开发者一样走出的一小步。
浙公网安备 33010602011771号