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();
singleton模式的優點:
singleton模式的主要好處在於它對代碼的組織作用。把相關方法和屬性群組織在一個不會被多次執行個體化的singleton中,可以使代碼的調用和維護變得更輕鬆。把方法包裹在singleton中,可以防止它們被其他程式員誤改,還可以防止全域命名空間被一大堆變數汙染。
singleton模式的缺點:
由於singleton模式提供的是一種單點訪問,所以它有可能導致模組間的強耦合,不利於單元測試。