欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript 單例/單體模式(Singleton)

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

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

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

Singleton obj = Singleton.getInstance();

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

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

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

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

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

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

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

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

3,閉包實(shí)現(xiàn)私有成員的惰性實(shí)例化單體
復(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};
}();

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

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

相關(guān)文章

  • JavaScript是如何實(shí)現(xiàn)繼承的(六種方式)

    JavaScript是如何實(shí)現(xiàn)繼承的(六種方式)

    大多OO語(yǔ)言都支持兩種繼承方式: 接口繼承和實(shí)現(xiàn)繼承 ,而ECMAScript中無(wú)法實(shí)現(xiàn)接口繼承,ECMAScript只支持實(shí)現(xiàn)繼承,而且其實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn),下文給大家技術(shù)js實(shí)現(xiàn)繼承的六種方式,需要的朋友參考下
    2016-03-03
  • JavaScript擴(kuò)展運(yùn)算符的學(xué)習(xí)及應(yīng)用詳情(ES6)

    JavaScript擴(kuò)展運(yùn)算符的學(xué)習(xí)及應(yīng)用詳情(ES6)

    這篇文章主要介紹了JavaScript擴(kuò)展運(yùn)算符的學(xué)習(xí)及應(yīng)用詳情(ES6),擴(kuò)展運(yùn)算符是ES6新增的一種運(yùn)算符,他可以幫助我們簡(jiǎn)化代碼,簡(jiǎn)化操作,具體相關(guān)知識(shí)感興趣的小伙伴可以查看下面文章的簡(jiǎn)單介紹
    2022-08-08
  • JS經(jīng)典正則表達(dá)式筆試題匯總

    JS經(jīng)典正則表達(dá)式筆試題匯總

    這篇文章主要介紹了JS經(jīng)典正則表達(dá)式筆試題,結(jié)合實(shí)例形式匯總分析了javascript正則表達(dá)式的經(jīng)典使用技巧,需要的朋友可以參考下
    2016-12-12
  • JS中使用Array函數(shù)shift和pop創(chuàng)建可忽略參數(shù)的例子

    JS中使用Array函數(shù)shift和pop創(chuàng)建可忽略參數(shù)的例子

    這篇文章主要介紹了JS中使用Array函數(shù)shift和pop創(chuàng)建可忽略參數(shù)的例子,這是一種比較高級(jí)的應(yīng)用,需要的朋友可以參考下
    2014-05-05
  • 如何利用JS判斷整數(shù)x是否是回文數(shù)

    如何利用JS判斷整數(shù)x是否是回文數(shù)

    回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù),下面這篇文章主要給大家介紹了關(guān)于如何利用JS判斷整數(shù)x是否是回文數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • JavaScript 動(dòng)態(tài)三角函數(shù)實(shí)例詳解

    JavaScript 動(dòng)態(tài)三角函數(shù)實(shí)例詳解

    本文通過(guò)實(shí)例代碼給大家實(shí)例講解了javascript動(dòng)態(tài)三角函數(shù)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-01-01
  • 一文詳解JavaScript閉包典型應(yīng)用

    一文詳解JavaScript閉包典型應(yīng)用

    這篇文章主要介紹了關(guān)于Javascript閉包典型應(yīng)用,文中有非常詳細(xì)的代碼示例.對(duì)正在學(xué)習(xí)js的伙伴們有很好的幫助,需要的朋友可以參考下
    2022-04-04
  • JavaScript彈出窗口方法匯總

    JavaScript彈出窗口方法匯總

    這篇文章主要介紹了JavaScript彈出窗口方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • layer更改皮膚的實(shí)現(xiàn)方法

    layer更改皮膚的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇layer更改皮膚的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • javascript eval函數(shù)深入認(rèn)識(shí)

    javascript eval函數(shù)深入認(rèn)識(shí)

    發(fā)現(xiàn)為本文起一個(gè)合適的標(biāo)題還不是那么容易,呵呵,所以在此先說(shuō)明下本文的兩個(gè)目的
    2009-02-02

最新評(píng)論