精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設計模式 | 工作中會用到的單例模式

開發 前端
單例模式是非常常用的一種設計模式,工作中我們會用到例如彈窗、音頻管理、消息管理中心、公共工具函數類等在應用中只需要單個實例的場景,這些都和單例模式密不可分。

[[416951]]

本文轉載自微信公眾號「DYBOY」,作者DYBOY。轉載本文請聯系DYBOY公眾號。

單例模式是非常常用的一種設計模式,工作中我們會用到例如彈窗、音頻管理、消息管理中心、公共工具函數類等在應用中只需要單個實例的場景,這些都和單例模式密不可分。

單例模式,很常用也非常重要,將單例模式應用于程序開發設計,可減少重復代碼,提升程序效率,同時單例的唯一性也使得數據流更加清晰,便于維護管理。

一、什么是單例模式

單例模式(Singleton Pattern)保證一個類只有一個實例,并提供一個訪問它的全局訪問點。

是不是瞬間想到了 JavaScript 中的全局變量 window、localStorage,它們在全局中提供了訪問點,并且只有唯一實例。

在一些多線程編程語言中,單例模式會涉及到同步鎖的問題,而 JavaScript 是單線程運行的,因此可以暫時忽略線程安全問題。

單例和單身狗類似,直到程序銷毀,整個程序里都找不出第二個和它能夠匹配上的

二、實現單例模式

單例模式從其定義就可以看出,是一個比較簡單的設計模式,其核心思想是保證唯一實例,因此如下簡單實現一個蒙層功能單例類,一步步完善。

2.1 蒙層單例類

現在的工作環境下都是基于 ES6 及以上的開發模式,因此我們直接帶入 class 思想去實現,如果有需要了解相關基礎內容的同學推薦閱讀:《這些JS設計模式的基礎知識點你都會了嗎?》。

蒙層的功能:

  • 層級最大,覆蓋瀏覽器可視區域
  • 阻止用戶所有點擊事件
  • 透明蒙層

因此,該蒙層單例的實現如下:

  1. /** 
  2.  * Mask 蒙層單例 
  3.  */ 
  4. class Mask { 
  5.   static instance: Mask; 
  6.   private isShow: boolean; 
  7.   private maskDom: HTMLDivElement; 
  8.  
  9.   static getInstance() { 
  10.     if (!Mask.instance) { 
  11.       Mask.instance = new Mask(); 
  12.     } 
  13.     return Mask.instance; 
  14.   } 
  15.  
  16.   constructor() { 
  17.     this.isShow = false
  18.     this.maskDom = this.init(); 
  19.   } 
  20.  
  21.   /** 
  22.    * 創建蒙層DOM 
  23.    */ 
  24.   private init() { 
  25.     const dom = document.createElement("div"); 
  26.     dom.setAttribute( 
  27.       "style"
  28.       "z-index: 99999; position: fixed; top: 0; left: 0; width: 100%; height: 100%; display: none; pointer-events: all; user-select: none; cursor: not-allowed;" 
  29.     ); 
  30.     document.body.appendChild(dom); 
  31.     return dom; 
  32.   } 
  33.  
  34.   /** 
  35.    * show 顯示蒙層 
  36.    */ 
  37.   public show() { 
  38.     if (this.isShow) return
  39.     this.maskDom.style["display"] = "block"
  40.     this.isShow = true
  41.   } 
  42.  
  43.   /** 
  44.    * hide 隱藏蒙層 
  45.    */ 
  46.   public hide() { 
  47.     if (!this.isShow) return
  48.     this.maskDom.style["display"] = "none"
  49.     this.isShow = false
  50.   } 
  51.  
  52. // 直接導出實例 
  53. export default Mask.getInstance(); 

使用方式:

  1. import Mask from "./utils/Mask"
  2.  
  3. Mask.show(); 
  4. Mask.hide(); 

這種在已開始就創建實例的方式,被稱作“餓漢式單例”,另一種在需要的時候才創建實例的方式被稱作“懶漢式單例”。

因此“餓漢式單例”的缺點就是:類加載時就初始化,浪費內存。

不過在現代借助 Webpack 等打包構建工具,如果沒有使用到這個組件,也不會將這個組件打包進來,另外在 React、Vue 框架按需加載組件的設計實現下,組件也是按需通過網絡下載分包組件文件,然后緩存起來,所以浪費內存這一缺點可忽略。因此,在 JavaScript 中懶漢式和餓漢式的區分不大。

推薦使用導出的時候就導出一個實例,例如:

  1. export default Mask.getInstance(); 

2.2 透明蒙層單例

在上述的導出實例中,只能調用 Mask.getInstance() ,對于其他使用者來說其實已經規避了如何判斷是否是單例類的問題。

另外,如果我們的導出形式是這樣的:

  1. export default Mask; 

那么其他同學在引用這個組件時候,如果不知道是一個單例類,那他就可能會直接 new Mask() 方式使用,那么就會創建多個不同的實例,失去了單例的效果,為了讓單例類使用的時候能像普通類創建對象的寫法一致,在使用的時候和其他普通類一樣,我們把這個處理方式叫做“透明化”。

為此,稍微改動下構造函數中的判斷:

  1. constructor() { 
  2.   if (Mask.instance) { 
  3.     return Mask.instance; 
  4.   } 
  5.   this.isShow = false
  6.   this.maskDom = this.init(); 
  7.   return Mask.instance = this; 
  8.  
  9. ... 
  10.  
  11. export default Mask; 

使用驗證:

  1. const a = new Mask(); 
  2. a.show(); 
  3. const b = new Mask(); 
  4. b.hide(); 
  5. console.log("是否相等:", a === b); 
  6. // output: 是否相等 true,并且蒙層被隱藏 

如果為了保證類的透明性,使用方式的統一,可以采用在構造函數中預先判斷是否存在實例的方式來實現。

2.3 單例化工具函數

通過上述對單例模式的實現和使用,其實可以想到一個問題,單例模式,只需要保證唯一實例即可,而保證唯一實例的方式,是通過一個變量來判斷當前實例是否已經被創建過,如果已經創建了,則直接返回該實例,否則創建后再返回實例。

那么通用的單例模式,應該將單例化和類的職責拆分開。

講到這,對于前面分享的《從“圖片預加載”認識代理設計模式》中的緩存代理就非常相似了,借助代理模式的思想,用閉包來緩存單例。

單例化緩存工具函數:

  1. export const proxySingleton = (fn) => { 
  2.   let instance; 
  3.   return () => { 
  4.     if (instance) return instance; 
  5.     return instance = new fn(); 
  6.   }; 
  7. }; 

傳入我們之前寫的任意類,類名指向了構造函數

  1. export const singletonMask = proxySingleton(Mask); 

使用的時候:

  1. import { singletonMask } from "./utils/ProxySingleton"
  2.  
  3. const a = singletonMask(); 
  4. a.show(); 
  5. const b = singletonMask(); 
  6. b.hide(); 
  7. console.log("是否相等:", a === b); 
  8. // output: 是否相等 true,并且蒙層被隱藏 

這樣我們就將單例化和創建蒙層類職責拆分,遵循單一職責原則。

2.4 ES6 export實例 import單例

舉一反三,是不是在 ES6 中直接 export 一個實例是否就可以看作是單例了吶?

  1. export default new Mask(); 

import 引入是采用的單例(Singleton)模式,多次用 import 引入同一個模塊時,只會引入一次該模塊的實例 —— 《ECMAScript 6 入門》

因此,如果要通用的單例對象,我們可以直接在 export 的時候,就導出實例。

之前我們研究過 EventEmitter3 事件觸發器的原理,為了讓之在全局只有一個實例,我們的使用方法如下:

  1. // ./utils/eventEmitter.ts 
  2. import EventEmitter from 'eventemitter3'
  3.  
  4. export default new EventEmitter(); 

這樣導出的 eventEmitter 就是一個單例,唯一,且全局可訪問。

三、總結

單例模式在工作中經常用到,當我們有意識地使用單例管理具有唯一屬性的實例,將會使得程序更容易管理維護。

結合 ES6 的 import 和 export 關鍵詞,單例模式的應用也變得更加簡便。 

在實現單例中,我們有將單例和蒙層類功能拆分開,也有合在一起的,這取決于在你的項目中想要如何設計,如果單例并非是大面積的組件套用,其實還是推薦合在一起,有助于后續在單文件中維護整個功能類。

 

責任編輯:武曉燕 來源: DYBOY
相關推薦

2021-10-27 17:57:35

設計模式場景

2021-02-01 10:01:58

設計模式 Java單例模式

2021-04-18 21:07:32

門面模式設計

2021-03-02 08:50:31

設計單例模式

2021-04-14 09:02:22

模式 設計建造者

2022-02-06 22:30:36

前端設計模式

2013-11-26 16:20:26

Android設計模式

2016-03-28 10:23:11

Android設計單例

2022-06-07 08:55:04

Golang單例模式語言

2024-02-04 12:04:17

2015-09-06 11:07:52

C++設計模式單例模式

2024-12-11 08:20:57

設計模式源碼

2021-09-07 10:44:35

異步單例模式

2022-09-29 08:39:37

架構

2023-08-03 08:01:27

單例模式結構開發

2022-03-29 07:52:07

設計模式單例設計模式java

2024-03-06 13:19:19

工廠模式Python函數

2011-03-16 10:13:31

java單例模式

2021-02-07 23:58:10

單例模式對象

2012-10-30 09:44:33

敏捷開發
點贊
收藏

51CTO技術棧公眾號

91麻豆.com| 国产精品日本| 亚洲爱爱爱爱爱| 99精品视频在线看| 91.xxx.高清在线| 福利一区福利二区| 国产精品久久久久久久av大片| 欧美爱爱免费视频| 欧美综合精品| 日韩一区二区麻豆国产| wwwxxx黄色片| 直接在线观看的三级网址| 久久婷婷综合激情| 91一区二区三区| 永久免费无码av网站在线观看| 国产大片一区| 亚洲区在线播放| 91亚洲一线产区二线产区| 欧美日韩五码| 午夜精品福利在线| 欧美一级黄色录像片| 日本精品专区| 高清国产一区二区| 成人免费淫片aa视频免费| 久久精品视频5| 亚洲成色精品| 另类色图亚洲色图| 国产精品久久久久久久av| 久久夜色精品国产噜噜av小说| 欧美久久一二三四区| 成年人免费在线播放| 超碰在线cao| 一区二区三区在线观看欧美| 宅男av一区二区三区| 国产片在线观看| 91麻豆国产香蕉久久精品| 高清国产一区| 精品人妻无码一区二区| 精品在线一区二区| 国产精品成av人在线视午夜片| 香蕉视频一区二区| 亚洲夜间福利| 国内精品一区二区三区四区| 亚洲成人生活片| 中文字幕午夜精品一区二区三区| 一区二区三区动漫| 女女互磨互喷水高潮les呻吟| 五月国产精品| 日韩精品高清在线| 亚洲欧美在线不卡| 国产精品一区二区三区美女| 精品久久久久一区| 97中文字幕在线观看| theporn国产在线精品| 欧美成人a∨高清免费观看| 初高中福利视频网站| 午夜视频一区二区在线观看| 日韩精品专区在线影院观看| wwwww在线观看| 久久97精品| 亚洲欧美另类在线观看| 丰满圆润老女人hd| 精品美女视频| 久久精品视频亚洲| 久久综合加勒比| 中文日韩在线| 国产精品户外野外| 一区二区日韩视频| 国产真实精品久久二三区| 91久久久久久久久久久久久| 精品人妻一区二区三区换脸明星| 国产剧情一区二区| 精品欧美日韩在线| 国产69久久| 亚洲精品视频免费看| 无码粉嫩虎白一线天在线观看 | 亚洲男人天堂av| av 日韩 人妻 黑人 综合 无码| 久久不射影院| 一本久久精品一区二区| 91国产精品视频在线观看| 精品国产伦一区二区三区观看说明| 欧美一级在线免费| 亚洲欧美在线不卡| 久久视频国产| 久久久久在线观看| 高潮无码精品色欲av午夜福利| 精品一区二区在线观看| 国产精品对白刺激久久久| 九色在线观看| 亚洲免费电影在线| 免费黄色日本网站| 欧美视频在线视频精品| 精品国产伦一区二区三区免费| 欧美激情aaa| 欧美一区二区三区久久精品| 欧美怡春院一区二区三区| 国产精品一级二级| 91网站黄www| 国产大尺度在线观看| 91色在线看| 7777女厕盗摄久久久| 这里只有精品在线观看视频| 日韩精品诱惑一区?区三区| 欧美极品少妇xxxxⅹ喷水| jizz国产在线观看| 国产精品99久久久久久有的能看 | 男女视频在线观看| 亚洲人成网站在线| 国产性xxxx18免费观看视频| 九九99久久精品在免费线bt| 亚洲免费视频一区二区| 中文字幕在线有码| 美腿丝袜在线亚洲一区| 蜜桃视频在线观看91| 国产网红在线观看| 欧美日韩国产成人在线免费| 欧美狂猛xxxxx乱大交3| 亚洲黄色成人| 99久久精品免费看国产一区二区三区 | 99re视频这里只有精品| 美国av在线播放| 最新日韩一区| 亚洲欧美另类国产| 特一级黄色大片| 国产成人精品免费网站| 法国空姐在线观看免费| 久久天天久久| 国产亚洲精品日韩| 亚洲 欧美 中文字幕| proumb性欧美在线观看| 激情五月婷婷六月| 麻豆国产精品| 久久九九亚洲综合| 亚洲视频一区在线播放| 国产亚洲成av人在线观看导航| 亚洲熟妇无码另类久久久| 一区二区在线视频观看| 欧美精品免费在线观看| 国产精品九九九九| 国产精品九色蝌蚪自拍| 色婷婷狠狠18| 成人嫩草影院| 国产精品一区二区久久国产| 国产黄色片在线观看| 欧美中文字幕一区二区三区| 91成人破解版| 老妇喷水一区二区三区| 欧美性大战久久久久| 香蕉成人影院| 日韩在线观看免费av| 在线视频 中文字幕| 亚洲欧美在线视频| av在线网站免费观看| 欧美a级片网站| 国产伦精品一区二区三毛| heyzo在线| 亚洲欧美精品一区二区| 亚洲性猛交富婆| 中文字幕一区二| 在线观看日本www| 永久91嫩草亚洲精品人人| 成人动漫视频在线观看完整版 | 性感美女一区二区三区| 一区二区日本视频| 欧洲精品码一区二区三区免费看| av在线一区不卡| 久久午夜a级毛片| 懂色av一区二区三区四区| 精品露脸国产偷人在视频| 国产成人无码精品久久二区三| 日本成人在线电影网| 91九色国产ts另类人妖| 精品无人区一区二区| 日韩免费在线观看视频| 日本在线观看www| 欧美变态tickle挠乳网站| 国产视频91在线| 国产精品久久久久婷婷二区次| 免费不卡av网站| 午夜在线精品偷拍| 中国人体摄影一区二区三区| 一区二区三区在线免费看| 日本久久久久久| 欧美激情午夜| 日韩成人在线电影网| 一二三四区在线| 亚洲成人av在线电影| 女人十八毛片嫩草av| 成人夜色视频网站在线观看| 欧美在线观看视频网站| 欧美日韩三级| 日本一区二区三区www| 日韩精品三级| 国产精品福利久久久| 天堂8中文在线| 在线观看日韩av| 天天干天天舔天天射| 欧美日本一道本在线视频| 日韩av男人天堂| 国产精品视频你懂的| 日批在线观看视频| 韩国欧美一区二区| 茄子视频成人免费观看| 亚洲免费二区| 日韩在线三级| 欧美日日夜夜| 成人免费视频网站| 欧美日韩视频免费观看| 久久理论片午夜琪琪电影网| 日本亚洲精品| 亚洲视频777| 男人天堂一区二区| 欧美精品日韩综合在线| 无码人妻精品一区二| 亚洲一区免费在线观看| 久久精品国产亚洲AV成人婷婷| av日韩在线网站| xxxx国产视频| 国产在线日韩欧美| 欧美三级午夜理伦三级富婆| 国产精品久久久久久久免费软件| 欧美少妇一级片| 成人精品亚洲| 日本成人黄色免费看| 欧美国产不卡| 精品国产免费一区二区三区 | 久久电影国产免费久久电影| www.爱色av.com| 亚洲区第一页| 国产成人生活片| 欧美一区影院| 韩国黄色一级大片| 性xxxx欧美老肥妇牲乱| 先锋影音一区二区三区| 欧美日韩一区二区综合 | 免费观看成年在线视频网站| 亚洲国产精品女人久久久| 黄片毛片在线看| 亚洲大胆人体在线| 日本黄色三级视频| 亚洲国产精品va| 天堂av资源在线| 日韩av有码在线| 神马亚洲视频| 亚洲免费高清视频| 黄色av免费在线观看| 国产小视频国产精品| www亚洲人| xx视频.9999.com| fc2在线中文字幕| 亚洲精品一区二区在线| 黄色网址在线播放| 亚洲天堂网在线观看| 国产51人人成人人人人爽色哟哟| 亚洲欧美在线看| av电影在线网| 久久夜色精品国产欧美乱| 羞羞的视频在线观看| 久久久久亚洲精品国产| 91久久国产综合久久91猫猫| 日韩暖暖在线视频| 免费视频观看成人| 97久久夜色精品国产九色| 成人搞黄视频| 欧美精品七区| 999国产精品| 久久人人爽人人爽人人av| 久久av最新网址| 天天视频天天爽| 国产成人免费视| 中文字幕日韩三级片| 欧美国产综合一区二区| 免费成人深夜夜行网站| 香蕉成人伊视频在线观看| 亚洲天堂五月天| 欧美一级欧美一级在线播放| 少妇精品视频一区二区| 亚洲人成在线观看| 国产三级在线播放| 69视频在线免费观看| 日韩国产91| 久久av一区二区| 小说区亚洲自拍另类图片专区| 久久国产精品网| 免费成人美女在线观看| 日批免费观看视频| 久久精品一区四区| 麻豆91精品91久久久| 一本色道久久加勒比精品 | 亚洲女人天堂网| 黄色网址免费在线观看| 欧美诱惑福利视频| 国产亚洲久久| 日本精品一区二区三区不卡无字幕| 亚洲国产一成人久久精品| 成年人网站免费视频| 毛片基地黄久久久久久天堂| 亚洲国产精品第一页| 国产精品天干天干在线综合| 国产午夜久久久| 欧美三级电影网| 人人妻人人玩人人澡人人爽| 日韩在线观看你懂的| 高清不卡亚洲| 国产麻豆一区二区三区在线观看| 成久久久网站| 欧美性久久久久| 成人午夜视频在线观看| 天天鲁一鲁摸一摸爽一爽| 色婷婷综合久久久| 老熟妇高潮一区二区高清视频| 日韩专区中文字幕| 激情开心成人网| 久久一区二区三区欧美亚洲| 韩日精品视频| 操人视频免费看| 国产精品久久久一本精品| 中文字幕国产在线观看| 欧美精品一区二区三区很污很色的| 国产丝袜在线| 91精品美女在线| 菠萝蜜一区二区| 亚洲精品无码久久久久久| 成人丝袜18视频在线观看| 日韩在线观看免| 欧美日韩中字一区| 黄色在线小视频| 国产91精品青草社区| 欧美美女在线直播| 日本aa在线观看| 懂色av一区二区三区免费观看 | 国产h在线观看| 国产suv精品一区二区| 伊人久久大香线蕉综合网站| 国产午夜大地久久| av在线不卡网| 欧美日韩乱国产| 精品中文视频在线| 成人欧美一区二区三区的电影| 久久精品日产第一区二区三区精品版| 亚洲无毛电影| 亚洲观看黄色网| 欧美日韩国产综合视频在线观看中文| 天堂在线观看视频| 97av在线影院| 台湾佬综合网| 国产一区视频免费观看| 国产欧美一区二区三区鸳鸯浴| 日本熟女毛茸茸| 中文国产成人精品| 999色成人| 日韩欧美视频免费在线观看| 国产999精品久久| 亚欧视频在线观看| 日韩精品在线免费| 主播大秀视频在线观看一区二区| 亚洲精品高清国产一线久久| 精品影视av免费| 波多野结衣家庭教师| 欧美日韩国产三级| 色帝国亚洲欧美在线| 久久爱av电影| 日本欧美韩国一区三区| 中文字幕五月天| 亚洲精品97久久| yellow字幕网在线| 日本一区免费观看| 黄色小说综合网站| 国产一级淫片免费| 亚洲日本欧美中文幕| 91成人福利社区| 欧美视频在线观看视频| 国产人久久人人人人爽| 国产熟女一区二区三区四区| 97视频免费观看| 欧美3p视频| 91视频在线免费| 欧美午夜电影在线播放| av在线影院| 日本一区美女| 成人综合在线网站| 91黑人精品一区二区三区| 粗暴蹂躏中文一区二区三区| 日韩电影不卡一区| 99九九99九九九99九他书对| 亚洲国产综合视频在线观看| 国产区视频在线| 国产伦精品一区二区三区免| 日韩国产高清在线| 久久综合成人网| 最新国产精品亚洲| 久久porn| 日韩欧美中文视频| 欧美这里有精品| 77thz桃花论族在线观看| 中国成人亚色综合网站| 久久综合中文字幕| 成人h动漫精品一区二区无码| 日本精品视频在线|