当前位置: 首页 > Web前端 > JavaScript

JavaScript设计模式——单例模式

时间:2023-03-26 21:29:25 JavaScript

濡傛灉瑙夊緱鏂囩珷涓嶉敊锛岃鍏虫敞鐐硅禐鍒嗕韩锛佹寔缁垎浜妧鏈崥鏂囷紝鍏虫敞寰俊鍏紬鍙佛煈夝煆诲墠绔疞eBron閽堝闈㈠悜瀵硅薄杞欢璁捐杩囩▼涓叿浣撻棶棰樼殑绠€娲佷紭闆呯殑瑙e喅鏂规鈥斺€旇璁℃ā寮忚璁℃ā寮忓師鐞嗭細銆嬫壘鍑虹▼搴忎腑鐨勫彉鍖?鍜孋hanges琚皝瑁呫€嬩负浠€涔堣瀛︿範璁捐妯″紡锛熸垜浠庝簨寮€鍙戜竴骞村浜嗭紝鐪嬭繃鑰侀」鐩紝浠庨浂鍒颁竴涓惌寤轰竴涓」鐩€傞殢鐫€椤圭洰鍜屼笟鍔$殑涓嶆柇鎵╁ぇ锛屽鏋滃啓鍑烘潵鐨勪唬鐮佷笉鏄璁″嚭鏉ョ殑锛屼細鎱㈡參鍙樻垚涓€搴mm...x灞便€備汉涔嬫墍浠ヨ兘鐧讳笂椋熺墿閾剧殑椤剁锛屾槸鍥犱负鍙互瀛︿範銆佹€荤粨銆佷娇鐢ㄢ€滃悕瀛椻€濆拰鈥滃伐鍏封€濄€傝璁℃ā寮忎笉鏄嚟绌哄彂鏄庣殑锛屽畠鏄湪涓€瀹氱殑涓氬姟鍦烘櫙涓嬬紪绋嬬殑鏈€浣冲疄璺碉紝缁忚繃澶ч噺鐨勯」鐩疄璺垫€荤粨鍑烘潵鐨勮В鍐虫柟妗堬紝缁欏畠璧蜂釜鍚嶅瓧锛屽氨鎴愪簡璁捐妯″紡銆傚氨鍍忕鐞冩垬鏈痳t锛屾帶鐞冨悗鍗粡甯镐細鍠婂嚭澶氬皯鎴樻湳鏉ユ墦锛岃€屼笉鏄竴涓竴涓寚鎸ャ€傜畝鍗曠殑浠e彿寰€寰€姣斿啑闀跨殑鎻忚堪鏇翠紭闆呫€傛湁鍙兘浣犵粡甯哥敤涓€绉嶅彲浠ユ弿杩扮殑鏂瑰紡缂栧啓绋嬪簭锛屼絾浣犱笉鐭ラ亾瀹冪殑鍚嶅瓧銆傚畠鍙兘鏄竴绉嶈璁℃ā寮忋€傛墍浠ュ湪瀛︿範鐨勮繃绋嬩腑锛屾垜浠父甯镐細鏈夎繖鏍风殑鎰熻锛氬憸鍛滃憸锛侊紒鎴戠粡甯哥敤杩欎釜涓滆タ锛岀粡甯歌繖鏍峰啓锛屽師鏉ヨ繖灏辨槸xx妯″紡锛佹渶鍚庯紝涓轰粈涔堣瀛︿範璁捐妯″紡锛熻櫧鐒舵湁鏃跺€欒璁℃ā寮忎細澧炲姞浠g爜鐨勫鏉傚害锛屽鍔犲紑鍙戞垚鏈紝浣嗘槸鍗村ぇ澶ч檷浣庝簡缁存姢鎴愭湰銆傚浘涔﹂鐨勪功浜曠劧鏈夊簭鍦版暎钀藉湪鍚勪釜瑙掕惤锛岀姽濡傚ぇ娴锋崬閽堬紱浣嗗鏋滄妸瀹冧滑璐翠笂鏍囩锛屽垎绫绘湁搴忓湴鏀惧湪鎸囧畾鐨勪功鏋朵笂锛屽氨鏇村鏄撴壘鍒板畠浠簡銆傛兂璞′竴涓満鏅紝鏈変竴澶╋紝浣犳寚鐫€涓€娈典唬鐮佸紑濮嬪拻楠傦紝杩檟灞辨槸璋佸啓鐨勶紒榧犳爣涓婄Щ锛実it淇敼璁板綍鏄剧ず锛屽摝锛佹垜鍐欎簡瀹冿紝杩欏緢濂姐€傝刀绱у涔犺璁℃ā寮忥紝浼橀泤鍦板啓鍑虹畝娲併€佸彲閲嶇敤銆佹槗缁存姢鐨勭▼搴弤鍗曚緥妯″紡1.淇濊瘉涓€涓被鍙湁涓€涓疄渚嬶紝骞舵彁渚涘叏灞€璁块棶鐐硅闂畠2.涓昏瑙e喅aglobaluse绫婚绻佸垱寤哄拰閿€姣侊紝鍗犵敤鍐呭瓨瀹炵幇鍗曚緥妯″紡銆傚疄鐜颁竴涓畝鍗曠殑鍗曚緥妯″紡骞朵笉澶嶆潅銆傛棤闈炲氨鏄繚瀛樺疄渚嬪璞°€備笅娆¤幏鍙?鍒涘缓瀵硅薄鏃讹紝浼氱洿鎺ヨ繑鍥炲埌涔嬪墠鍒涘缓鐨勫疄渚嬨€傛渶绠€鍗曠殑渚嬪瓙PatternclosureimplementationES6implementation//浣跨敤闂寘瀹炵幇varSingleton=(function(){varinstance;functionInstance(){}returnfunction(){if(!instance){instance=newInstance();}杩斿洖瀹炰緥;};})();varsingle1=Singleton();varsingle2=Singleton();console.log(single1===single2);//true//ES6瀹炵幇绫籗ingleton{constructor(){if(!Singleton.instance){Singleton.instance=this;}杩斿洖鍗曚緥瀹炰緥锛泒}constsingle1=newSingleton();constsingle2=newSingleton();console.log(single1===single2);//truelazySingleton鎯版€у崟渚嬶細鍒濆鍖栨椂涓嶅垱寤哄疄渚嬶紝鑾峰彇瀹炰緥鏃跺垱寤哄疄渚嬶紝绫讳技浜庡墠绔祫婧愬欢杩熷姞杞界殑鎬濇兂//闈炴儼鎬у崟渚嬬被Tool{}classSingleTon{constructor(name,...args){this.name=nameif(!SingleTon.instance){SingleTon.instance=newTool(args)}}getName(){杩斿洖this.name;}闈欐€乬etInstance(){杩斿洖杩欎釜瀹炰緥锛泒}//鎯版€у崟渚嬬被Tool{}classSingleTon{constructor(name){this.name=name}getName(){returnthis.name;}staticgetInstance(){if(!this.instance){this.instance=newTool(arguments)}returnthis.instance;}}閫忔槑鍗曚緥鍜屼唬鐞嗗崟渚嬮€忔槑鍗曚緥灏嗗疄渚嬬殑鍒涘缓鍜屾柟娉曠殑鎵ц灏佽鍒颁竴涓被涓紝涓嶅お绗﹀悎鈥滃崟涓€鑱岃矗鍘熷垯鈥濓紝浠g爜涓嶆槗闃呰锛屼篃涓嶆槗鏀逛唬鐞嗕汉銆傚崟涓€鑱岃矗鍘熷垯鈥濓紝浠g爜鏄撹鏄撴敼//閫忔槑鍗曚緥绫籸eturncreatePerson.instance=this;}init(){console.log('Mynameis',this.name)}}constp1=newcreatePerson('lebron')constp2=newcreatePerson('james')p1.init();//Mynameislebronp2.init();//Mynameislebron//proxysingletonclassPerson{constructor(name){this.name=name;}init(){console.log('Mynameis',this.name)}}classcreatePerson{鏋勯€爐or(name){if(!createPerson.instance){createPerson.instance=newPerson(name)}returncreatePerson.instance;}}constp1=newcreatePerson('lebron')constp2=newcreatePerson('james')p1.init();//鎴戠殑鍚嶅瓧鏄嫆甯冩湕p2.init();//Mynameislebron鏈€缁堢増鏈幓鎺変簡姣忔瀹炵幇涓€涓被鐨勫崟渚嬫ā寮忔椂CV閲嶅鐨勬ā鏉夸唬鐮侊紝涓嶇鍚堥鏈熷洜姝わ紝鎴戜滑鍙互閬靛惊璁捐妯″紡鈥滄壘鍑虹▼搴忓湪鍝噷鍙戠敓鍙樺寲骞跺皝瑁呭彉鍖栤€濈殑鍘熷垯锛屽彲浠ュ仛濡備笅鏀归€燾lassSingleTon{constructor(fn){letsingleInstance;functionsingleConstructor(...args){//绗竴涓竴娆℃€у疄渚嬪寲if(!singleInstance){singleInstance=newfn(...args);}//澶氭瀹炰緥鍖栫洿鎺eturnreturnsingleInstance;}singleConstructor.prototype=Object.create(fn.prototype);杩斿洖鍗曚釜鏋勯€犲嚱鏁帮紱}}classPerson{constructor(name){this.name=name;}init(){console.log('Mynameis',this.name)}}constcreatePerson=newSingleTon(Person);constp1=newcreatePerson('lebron');constp2=newcreatePerson('james');p1.init();//鎴戠殑鍚嶅瓧鏄痩ebronp2.init();//鎴戠殑鍚嶅瓧鏄痩ebronconsole.log(p1===p2)//trueclassTool{constructor(number){this.number=number;}init(){console.log('杩欐槸宸ュ叿',this.number)}}constcreateTool=newSingleTon(Tool);constt1=newcreateTool(1);constt2=newcreateTool(2);t1銆傚湪閲岄潰锛堬級;//杩欐槸宸ュ叿1t2.init();//杩欐槸宸ュ叿1console.log(t1===t2);//鐪熷崟渚嬫ā寮忕殑搴旂敤鍦烘櫙鐧诲綍绐楀彛鐧诲綍绐楀彛鍦ㄦ垜浠殑杞欢涓緢甯歌锛屼篃寰堥€傚悎鐢ㄥ崟渚嬫ā寮忓垱寤猴紙鍏ㄥ眬鍞竴锛岀粡甯镐娇鐢級鐢ㄥ崟渚嬫ā寮忓垱寤猴紝閬垮厤澶氳妭鐐瑰垱寤哄拰閿€姣佺被鐧诲綍{constructor(){this.element=document.createElement('div');this.element.innerHTML=`usernamepassword`;this.element.style.cssText=`瀹藉害锛?00px锛涢珮搴︼細100px锛涗綅缃細缁濆锛涘乏锛?0%锛涗笂锛?0%锛涗笂杈硅窛锛?50px锛涘乏杈硅窛锛?50px锛涙樉绀猴細鏃燻锛沝ocument.body.appendChild(this.element);}show(){this.element.style.display='block';console.log('鏄剧ず');}hide(){this.element.style.display='none';console.log('闅愯棌');}}//浣跨敤涓婇潰鐨勬渶缁堢増鏈垱寤哄崟渚嬩唬鐮乧onstcreateLogin=newSingleTon(Login);constloginInstance=createLogin();document.getElementById('show-btn').addEventListener('click',function(){loginInstance.show();});document.getElementById('hide-btn').addEventListener('click',function(){loginInstance.hide();});瀛樺偍鍏ㄥ眬鐘舵€佺鐞嗭紝鍏ㄥ眬鍞竴瀹炰緥锛屽Vuex/Redux/Mobx//宸茬粡鐪佺暐浜嗕竴浜涗笉鐩稿叧鐨勪唬鐮乪rror('[vuex]alreadyinstalled.Vue.use(Vuex)shouldbecalledonceonce.')return}Vue=_Vue}JqueryJquery涔熸槸搴旂敤鐨勫崟渚嬫ā寮忥紝铏界劧宸茬粡閫愭笎娣″嚭浜嗘垜浠殑瑙嗛噹馃槀if(window.jQuery!=null){returnwindow.jQuery;}else{//init~~~~~~~}浣跨敤鍦烘櫙鎬荤粨淇濊瘉涓€涓被鍙湁涓€涓疄渚嬶紝鎻愪緵鍏ㄥ眬璁块棶鐐硅闂畠鐨勪紭鍔垮彧鏄湪鍐呭瓨涓竴涓疄渚嬶紝鍑忓皯浜嗗唴瀛樼殑寮€閿€锛屽挨鍏舵槸棰戠箒鍒涘缓鍜岄攢姣佸疄渚嬶紝閬垮厤浜嗚祫婧愮殑澶氭鍗犵敤闂茶瘽涓€鐩村繖浜巘涓婂崐骞存瘯涓氫粬涓€骞达紝鐒跺悗浼戞伅浜嗕竴娈垫椂闂达紝鍗婂勾澶氭病鍐欐妧鏈枃绔犱簡銆傝繘鍏ュ伐浣滃悗锛屾垜寮€濮嬮€愭笎閫傚簲鏇村ソ鐨勫涔犲拰宸ヤ綔鐘舵€併€傚仛涓€浜涘涔犺鍒掞紝绠€鍘嗗拰鏇存柊鏂囩珷锛堝ソ涔呮病鍐欎簡锛屽绗竴涓郴鍒楄繕鏄湁鐐圭湅涓嶆儻鐨勩€婅璁℃ā寮忋€嬶紝绗竴涓ⅷ杩瑰ソ涔呬簡锛岀粓浜庡嚭鍝佷簡銆傚叧娉?up浼氭寔缁洿鏂帮紝鏇存柊棰戠巼鍜岃繘搴︾湅鍏嶈垂鏃堕棿鍒板搱鍝堬紝娆㈣繋鍏虫敞~涓€涓繕鍦ㄥ姫鍔涚殑鍓嶇宸ョ▼甯堬紝缁х画鍔姏锛佺户缁垎浜妧鏈崥鏂囷紝娆㈣繋鍏虫敞锛?/p>