《JavaScript设计模式》读书笔记:singleton模式
singleton模式在三种模式分类中属于创建型模式。在《设计模式》一书中,这样描述其意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
在《JavaScript设计模式》中,singleton有了一个更广义的定义:singleton是一个用来划分命名空间并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。这段话中,指出了singleton模式在JavaScript中的另一用途:划分命名空间。
1. 简单singleton
在JavaScript中,最简单的singleton就是一个对象字面量:
var Singleton = { attrbute1 : true, attribute2 : 10, function1 : function() { }, function2 : function() { } };
使用圆点运算符访问该对象的属性或方法:
Singleton.attribute1 = false; var total = Singleton.attribute2 + 5; var result = Singleton.method1();
2. 划分命名空间:
属性或者方法声明在singleton内部时,这些成员便不再是全局性的了,而是被包在了这个对象内部,需要使用对象名去访问。这样就避免了全局变量污染,避免了自己的函数或属性在应用的其他部分被覆盖或者改写。
3. 拥有私有成员的singleton
若想为singleton创建私有成员就必须借助于闭包。例:
1 MyNamespace = {};
2
3 MyNamespace.Singleton = (function() {
4 //private members
5 var privateAttribute1 = false;
6 var privateAttribute2 = [1, 2, 3];
7
8 function privateMethod1() {
9 //do something
10 }
11
12 function privateMethod2() {
13 console.log('privateMethod2');
14 //do other something
15 }
16
17 return {
18 //public members
19 publicAttribute1 : true,
20 publicAttribute2 : 10,
21
22 publicMethod1 : function() {
23 //call private method
24 privateMethod2();
25 },
26
27 publicMethod2 : function() {
28
29 }
30 };
31 })();
32
33
34 MyNamespace.Singleton.publicMethod1();
2
3 MyNamespace.Singleton = (function() {
4 //private members
5 var privateAttribute1 = false;
6 var privateAttribute2 = [1, 2, 3];
7
8 function privateMethod1() {
9 //do something
10 }
11
12 function privateMethod2() {
13 console.log('privateMethod2');
14 //do other something
15 }
16
17 return {
18 //public members
19 publicAttribute1 : true,
20 publicAttribute2 : 10,
21
22 publicMethod1 : function() {
23 //call private method
24 privateMethod2();
25 },
26
27 publicMethod2 : function() {
28
29 }
30 };
31 })();
32
33
34 MyNamespace.Singleton.publicMethod1();
singleton模式的优点:
singleton模式的主要好处在于它对代码的组织作用。把相关方法和属性组织在一个不会被多次实例化的singleton中,可以使代码的调用和维护变得更轻松。把方法包裹在singleton中,可以防止它们被其他程序员误改,还可以防止全局命名空间被一大堆变量污染。
singleton模式的缺点:
由于singleton模式提供的是一种单点访问,所以它有可能导致模块间的强耦合,不利于单元测试。
posted on 2010-04-07 00:24 followflows 阅读(417) 评论(2) 编辑 收藏 举报