文章出處

首先,單例模式是對象的創建模式之一,此外還包括工廠模式。單例模式的三個特點:
1,該類只有一個實例
2,該類自行創建該實例(在該類內部創建自身的實例對象)
3,向整個系統公開這個實例接口

Java中大概是這個樣子

class Singleton {
     
    //私有,靜態的類自身實例
    private static Singleton instance = new Singleton();
     
    //私有的構造子(構造器,構造函數,構造方法)
    private Singleton(){}
     
    //公開,靜態的工廠方法
    public static Singleton getInstance() {
        return instance;
    }
}

使用時

Singleton obj = Singleton.getInstance();

這個單例類在自身被加載時instance會被實例化,即便加載器是靜態的。因此,對于資源密集,配置開銷較大的單體更合理的做法是將實例化(new)推遲到使用它的時候。即惰性加載(Lazy loading),它常用于那些必須加載大量數據的單體。修改下

class LazySingleton {
    //初始為null,暫不實例化
    private static LazySingleton instance = null;
     
    //私有的構造子(構造器,構造函數,構造方法)
    private LazySingleton(){}
     
    //公開,靜態的工廠方法,需要使用時才去創建該單體
    public static LazySingleton getInstance() {
        if( instance == null ) {
            instance = new LazySingleton();
        }
        return instance;
    }   
}

使用方式同上。

單例模式是Javascript最基本,最有用的模式之一。它提供了一種將代碼組織為一個邏輯單元的手段,這個邏輯單元中的代碼通過單一的變量進行訪問。
單體在Javascipt中有許多用處,可以用來劃分命名空間,以減少全局變量的泛濫。還可以用在分支技術中用來處理各瀏覽器的差異。
Javascript中單例模式的實現方式有多種,每一種都有自身的優點或缺點。

 

1,對象直接量實現最基本,最簡單的單體

var Singleton = {
    attr1 : 1,
    attr2 : 'hello',
    method1 : function(){alert(this.attr2);},
    method2 : function(arg){}
}

這種方式中,對象所有成員都通過Singleton加點號訪問。所有成員是公開的,沒有私有的。在執行到變量Singleton時,會加載(實例化)自身,即非惰性加載。
此外method1用this訪問單體的其它成員會存在一些風險,因為method1的上下文不是總是指向Singleton對象。
比如當把method1作為事件監聽器時,this可能指向的是dom元素,這時可能會提示undefined。

 

2,閉包實現私有成員的單體

var Singleton = function(){
    var attr = 1, fn = function(){};
    return {
        method : function(){ fn(); },
        getAttr : function(){ return attr; }        
    };  
}();

這種方式中var定義私有的成員屬性attr,方法fn,然后返回一個公開的接口method和getAttr。今后修改實現時,接口方法method和getAttr不變,只需修改私有的attr和fn的具體實現。使用如下

Singleton.method();
Singleton.getAttr();


3,閉包實現私有成員的惰性實例化單體

var LazySingleton = function(){
    var attr = 1, fn = function(){};
    var obj = {
        method : function(){ fn(); },
        getAttr : function(){ return attr; }
    };
    function init(){
        return obj;
    }
    return {getInstace: init};
}();

適用場合上面已經提到:對于那些必須加載大量數據的單體直到需要使用它的時候才實例化。使用方式是這樣的

LazySingleton.getInstance().method();
LazySingleton.getInstance().getAttr();

4,又發現另一種

function singleton() {
    var obj = new Object();
    singleton = function() {
        return obj;
    };
    return obj;
}

僅在第一次時會new,這個Object泛指自定義的所有類。

原文鏈接:http://www.cnblogs.com/snandy/archive/2011/04/07/2007717.html


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()