最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 單例/單體模式(Singleton)

 更新時間:2011年04月07日 21:57:09   作者:  
首先,單例模式是對象的創(chuàng)建模式之一,此外還包括工廠模式。
單例模式的三個特點:
1,該類只有一個實例
2,該類自行創(chuàng)建該實例(在該類內(nèi)部創(chuàng)建自身的實例對象)
3,向整個系統(tǒng)公開這個實例接口
Java中大概是這個樣子
復(fù)制代碼 代碼如下:

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

使用時
復(fù)制代碼 代碼如下:

Singleton obj = Singleton.getInstance();

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

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

使用方式同上。
單例模式是Javascript最基本,最有用的模式之一。它提供了一種將代碼組織為一個邏輯單元的手段,這個邏輯單元中的代碼通過單一的變量進(jìn)行訪問。
單體在Javascipt中有許多用處,可以用來劃分命名空間,以減少全局變量的泛濫。還可以用在分支技術(shù)中用來處理各瀏覽器的差異。
Javascript中單例模式的實現(xiàn)方式有多種,每一種都有自身的優(yōu)點或缺點。
1,對象直接量實現(xiàn)最基本,最簡單的單體
復(fù)制代碼 代碼如下:

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

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

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

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

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

3,閉包實現(xiàn)私有成員的惰性實例化單體
復(fù)制代碼 代碼如下:

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

適用場合上面已經(jīng)提到:對于那些必須加載大量數(shù)據(jù)的單體直到需要使用它的時候才實例化。使用方式是這樣的
復(fù)制代碼 代碼如下:

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

相關(guān)文章

最新評論

烟台市| 安图县| 上思县| 花莲市| 绥德县| 靖宇县| 集贤县| 六盘水市| 新乐市| 仙桃市| 鄂尔多斯市| 甘孜| 肇东市| 海城市| 洛浦县| 浦城县| 林周县| 塔河县| 宣城市| 大余县| 广水市| 包头市| 东光县| 嘉义县| 阳原县| 台州市| 大化| 陆丰市| 台州市| 新昌县| 长汀县| 太谷县| 萝北县| 泰州市| 高碑店市| 沭阳县| 长垣县| 通海县| 柘荣县| 炎陵县| 天水市|