JavaScript設(shè)計(jì)模式之單件模式介紹
單件模式說(shuō)明
1. 說(shuō)明:?jiǎn)渭J剑褪庆o態(tài)化的訪問(wèn)中已經(jīng)實(shí)例化的對(duì)象,這個(gè)對(duì)象只能通過(guò)一個(gè)唯一的入口訪問(wèn),已經(jīng)實(shí)例或待實(shí)例化的對(duì)象;面向?qū)ο笳Z(yǔ)言如Java, .Net C#這樣的服務(wù)端動(dòng)態(tài)語(yǔ)言里,能保證類的操作有順的進(jìn)行,避免并行操作使數(shù)據(jù)發(fā)生混亂的情況;
2. 單件模式的好處:
1>. 減少 new 的操作,以免加快內(nèi)存頻繁操作,占用內(nèi)存;
2>. 盡量減少大系統(tǒng)的對(duì)象的開銷;
3>. 就是上面說(shuō)的,可以保障某些類型的操作有順序準(zhǔn)確的操作,以免并行處理引起的數(shù)據(jù)異?,F(xiàn)象;
當(dāng)然上面說(shuō)的好處,都是說(shuō)服務(wù)端語(yǔ)言里的。在javascript這種弱類型的語(yǔ)言,不要糾結(jié)那么多,因?yàn)槟_本都在自己的客戶端這邊操作的,沒(méi)有什么操作沖突的問(wèn)題;相當(dāng)于整個(gè)服務(wù)器就你一個(gè)人在用,不用擔(dān)心,你的數(shù)據(jù)會(huì)被其他什么人操作的問(wèn)題;
實(shí)例源碼
var Singleton = {
instance: null,
MailSender: function() {
var self = this;
self.to = '';
self.title = '';
self.content = '';
self.send = function() {
//send body
}
},
getInstance : function() {
if (this.instance == null) {
this.instance = new Singleton.MailSender();
}
return this.instance;
}
}
使用方法:
var mail = Singleton.getInstance();
mail.to = 'toname#mail.com';
mail.title = '單件模式發(fā)送';
mail.content = '發(fā)送內(nèi)容';
mail.send();
當(dāng)像有些全局框架,比如像 DWZ 這樣的富UI框架,創(chuàng)建一個(gè) 全局 的Singleton 后,Singleton.instance 都有值了,就不必要再創(chuàng)建;
當(dāng)然如果是寫成這樣的,會(huì)比較明了,跟服務(wù)端語(yǔ)言一置:
Singleton.getInstance().to = 'toname#mail.com';
Singleton.getInstance().title = '單件模式發(fā)送';
Singleton.getInstance().content = '發(fā)送內(nèi)容';
Singleton.getInstance().send();
其他實(shí)說(shuō)明
單件模式在什么的地方,比較有用呢?比如有一個(gè)操作服務(wù)器上一個(gè)統(tǒng)一的配置文件時(shí),比如像大規(guī)模并發(fā)操作還需要注意先來(lái)后到的情況時(shí),比如交易所的操作過(guò)程記錄等,都可以用 單件模式 來(lái)操作;
另外:?jiǎn)渭J降姆绞?
1. 上頭那種叫懶惰方式
2. 餓棍方式:
var Singleton = {
instance : new Singleton.MailSender(),
MailSender : function() {
var self = this;
self.to = '';
self.title = '';
self.content = '';
self.send = function() {
//send body
}
},
getInstance : function() {
return this.instance;
}
}
使用方法一樣;
使用閉包方式創(chuàng)建單件模式,隱藏 instance 對(duì)象
1. 代碼:
var Singleton = (function() {
var instance = null;
function MailSender() {
this.to = '';
this.title = '';
this.content = '';
}
MailSender.prototype.send = function() {
//send body
}
return {
getInstance : function() {
if (instance == null) {
instance = new MailSender();
}
return instance;
}
}
})();
2. 使用方法:
//一樣用法
var mail = Singleton.getInstance();
mail.to = 'toname#mail.com';
mail.title = '閉包式 單件模式發(fā)送';
mail.content = '發(fā)送內(nèi)容';
mail.send();
相關(guān)文章
js正文內(nèi)容高亮效果的實(shí)現(xiàn)方法
這篇文章介紹了js正文內(nèi)容高亮效果的實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-06-06
JS+Canvas實(shí)現(xiàn)接球小游戲的示例代碼
本文主要為大家詳細(xì)介紹了如何利用JS+Canvas實(shí)現(xiàn)接球小游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的小伙伴可以了解一下2022-06-06
uni-app微信小程序使用echarts的詳細(xì)圖文教程
為了兼容小程序Canvas,ECharts提供了一個(gè)小程序的組件,用這種方式可以方便地使用ECharts,下面這篇文章主要給大家介紹了關(guān)于uni-app微信小程序使用echarts的相關(guān)資料,需要的朋友可以參考下2022-10-10
JavaScript 實(shí)現(xiàn)的 zip 壓縮和解壓縮工具包Zip.js使用詳解
今天給大家介紹的文章是js實(shí)現(xiàn)的解壓縮插件zip.js,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-12-12
淺析使用BootStrap TreeView插件實(shí)現(xiàn)靈活配置快遞模板
這篇文章主要介紹了使用bootstrap-treeview插件實(shí)現(xiàn)靈活配置快遞模板的相關(guān)資料,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11
bootstrap中的 form表單屬性role="form"的作用詳解
這篇文章主要介紹了bootstrap中的 form表單屬性role="form"的作用詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-01-01
使用insertAfter()方法在現(xiàn)有元素后添加一個(gè)新元素
為javascript添加insertAfter()方法即在現(xiàn)有元素后添加一個(gè)新元素,示例如下,大家不妨學(xué)習(xí)下2014-05-05
Linux下編譯安裝php libevent擴(kuò)展實(shí)例
這篇文章主要介紹了Linux下編譯安裝php libevent擴(kuò)展實(shí)例,本文著重講解了編譯過(guò)程中一個(gè)錯(cuò)誤解決方法,需要的朋友可以參考下2015-02-02

