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)公開這個(gè)實(shí)例接口
Java中大概是這個(gè)樣子
class Singleton {
//私有,靜態(tài)的類自身實(shí)例
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;
}
}
使用時(shí)
Singleton obj = Singleton.getInstance();
這個(gè)單例類在自身被加載時(shí)instance會(huì)被實(shí)例化,即便加載器是靜態(tài)的。因此,對(duì)于資源密集,配置開銷較大的單體更合理的做法是將實(shí)例化(new)推遲到使用它的時(shí)候。即惰性加載(Lazy loading),它常用于那些必須加載大量數(shù)據(jù)的單體。修改下
class LazySingleton {
//初始為null,暫不實(shí)例化
private static LazySingleton instance = null;
//私有的構(gòu)造子(構(gòu)造器,構(gòu)造函數(shù),構(gòu)造方法)
private LazySingleton(){}
//公開,靜態(tài)的工廠方法,需要使用時(shí)才去創(chuàng)建該單體
public static LazySingleton getInstance() {
if( instance == null ) {
instance = new LazySingleton();
}
return instance;
}
}
使用方式同上。
單例模式是Javascript最基本,最有用的模式之一。它提供了一種將代碼組織為一個(gè)邏輯單元的手段,這個(gè)邏輯單元中的代碼通過單一的變量進(jìn)行訪問。
單體在Javascipt中有許多用處,可以用來劃分命名空間,以減少全局變量的泛濫。還可以用在分支技術(shù)中用來處理各瀏覽器的差異。
Javascript中單例模式的實(shí)現(xiàn)方式有多種,每一種都有自身的優(yōu)點(diǎn)或缺點(diǎn)。
1,對(duì)象直接量實(shí)現(xiàn)最基本,最簡(jiǎn)單的單體
var Singleton = {
attr1 : 1,
attr2 : 'hello',
method1 : function(){alert(this.attr2);},
method2 : function(arg){}
}
這種方式中,對(duì)象所有成員都通過Singleton加點(diǎn)號(hào)訪問。所有成員是公開的,沒有私有的。在執(zhí)行到變量Singleton時(shí),會(huì)加載(實(shí)例化)自身,即非惰性加載。
此外method1用this訪問單體的其它成員會(huì)存在一些風(fēng)險(xiǎn),因?yàn)閙ethod1的上下文不是總是指向Singleton對(duì)象。
比如當(dāng)把method1作為事件監(jiān)聽器時(shí),this可能指向的是dom元素,這時(shí)可能會(huì)提示undefined。
2,閉包實(shí)現(xiàn)私有成員的單體
var Singleton = function(){
var attr = 1, fn = function(){};
return {
method : function(){ fn(); },
getAttr : function(){ return attr; }
};
}();
這種方式中var定義私有的成員屬性attr,方法fn,然后返回一個(gè)公開的接口method和getAttr。今后修改實(shí)現(xiàn)時(shí),接口方法method和getAttr不變,只需修改私有的attr和fn的具體實(shí)現(xiàn)。使用如下
Singleton.method();
Singleton.getAttr();
3,閉包實(shí)現(xiàn)私有成員的惰性實(shí)例化單體
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í)例化。使用方式是這樣的
LazySingleton.getInstance().method();
LazySingleton.getInstance().getAttr();
1,該類只有一個(gè)實(shí)例
2,該類自行創(chuàng)建該實(shí)例(在該類內(nèi)部創(chuàng)建自身的實(shí)例對(duì)象)
3,向整個(gè)系統(tǒng)公開這個(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(){}
//公開,靜態(tài)的工廠方法
public static Singleton getInstance() {
return instance;
}
}
使用時(shí)
復(fù)制代碼 代碼如下:
Singleton obj = Singleton.getInstance();
這個(gè)單例類在自身被加載時(shí)instance會(huì)被實(shí)例化,即便加載器是靜態(tài)的。因此,對(duì)于資源密集,配置開銷較大的單體更合理的做法是將實(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(){}
//公開,靜態(tài)的工廠方法,需要使用時(shí)才去創(chuàng)建該單體
public static LazySingleton getInstance() {
if( instance == null ) {
instance = new LazySingleton();
}
return instance;
}
}
使用方式同上。
單例模式是Javascript最基本,最有用的模式之一。它提供了一種將代碼組織為一個(gè)邏輯單元的手段,這個(gè)邏輯單元中的代碼通過單一的變量進(jìn)行訪問。
單體在Javascipt中有許多用處,可以用來劃分命名空間,以減少全局變量的泛濫。還可以用在分支技術(shù)中用來處理各瀏覽器的差異。
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ì)象所有成員都通過Singleton加點(diǎn)號(hào)訪問。所有成員是公開的,沒有私有的。在執(zhí)行到變量Singleton時(shí),會(huì)加載(實(shí)例化)自身,即非惰性加載。
此外method1用this訪問單體的其它成員會(huì)存在一些風(fēng)險(xiǎn),因?yàn)閙ethod1的上下文不是總是指向Singleton對(duì)象。
比如當(dāng)把method1作為事件監(jiān)聽器時(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è)公開的接口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();
您可能感興趣的文章:
- JavaScript設(shè)計(jì)模式之單體模式全面解析
- JavaScript中實(shí)現(xiàn)單體模式分享
- javascript 設(shè)計(jì)模式之單體模式 面向?qū)ο髮W(xué)習(xí)基礎(chǔ)
- javascript設(shè)計(jì)模式之模塊模式學(xué)習(xí)筆記
- javascript設(shè)計(jì)模式之策略模式學(xué)習(xí)筆記
- JavaScript 設(shè)計(jì)模式 安全沙箱模式
- javascript設(shè)計(jì)模式 接口介紹
- 小議javascript 設(shè)計(jì)模式 推薦
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式)
- javascript設(shè)計(jì)模式之單體模式學(xué)習(xí)筆記
相關(guān)文章
js 返回時(shí)間戳所對(duì)應(yīng)的具體時(shí)間
返回unix時(shí)間戳所對(duì)應(yīng)的具體時(shí)間的代碼2010-07-07
整理Javascript數(shù)組學(xué)習(xí)筆記
整理Javascript數(shù)組學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)javascript數(shù)組,希望大家繼續(xù)關(guān)注2015-11-11
JS加jquery簡(jiǎn)單實(shí)現(xiàn)標(biāo)簽元素的顯示或隱藏
標(biāo)簽元素的顯示或隱藏在使用中還是挺頻繁的,下面有個(gè)不錯(cuò)的示例,大家可以參考下,或許有所幫助2013-09-09
layer.alert回調(diào)函數(shù)執(zhí)行關(guān)閉彈窗的實(shí)例
今天小編就為大家分享一篇layer.alert回調(diào)函數(shù)執(zhí)行關(guān)閉彈窗的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
fileupload控件 文件類型客戶端驗(yàn)證實(shí)現(xiàn)代碼
客戶端JS驗(yàn)證fileupload控件,設(shè)置只允許特定的文件類型 ,當(dāng)然服務(wù)器端更要判斷啊。這里是為了后臺(tái)驗(yàn)證的更順利。2009-11-11
js實(shí)現(xiàn)發(fā)送驗(yàn)證碼后的倒計(jì)時(shí)功能
本文解決方案的基本思路是點(diǎn)擊就將按鈕設(shè)為disabled,然后根據(jù)cookie判斷是否設(shè)置過期時(shí)間,將手機(jī)利用ajax提交到后臺(tái)的發(fā)短信接口,就可以了2015-05-05

