精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美精品生活片| 特黄毛片在线观看| 亚洲一区二区三区日本久久九| av网站免费线看精品| 日韩视频免费在线观看| 免费在线观看的av网站| 久草中文在线视频| 婷婷激情成人| 中文字幕精品一区| 日韩av不卡电影| 久久久久亚洲无码| 曰本三级在线| 亚洲精品国产成人影院| 欧美日韩一本到| 日韩高清国产精品| 免费又黄又爽又猛大片午夜| 亚洲大片精品免费| 欧美日韩中文字幕| 久久精品综合一区| www.国产高清| 欧美三级自拍| 亚洲国产综合在线| 国产精品一区二区三区观看| 久久午夜鲁丝片午夜精品| 一区二区精彩视频| 精品视频一区二区三区免费| 日本在线xxx| 亚洲三级中文字幕| 爽好多水快深点欧美视频| 亚洲天堂色网站| 向日葵污视频在线观看| 日本高清中文字幕在线| 国产综合色在线视频区| 国产亚洲精品久久久久久| 熟妇女人妻丰满少妇中文字幕| 超鹏97在线| 国产成人av网站| 午夜精品蜜臀一区二区三区免费| 日本黄色动态图| 亚洲性受xxx喷奶水| 国产精品色哟哟| 成人黄色av网站| 91香蕉视频在线播放| 国产视频一区二区在线播放| 一区二区三区四区国产精品| 国产精选一区二区| 亚洲黄色精品视频| 日韩高清不卡一区二区三区| 日韩中文字幕免费视频| 欧洲女同同性吃奶| 亚洲精品777| 欧美性大战久久| 免费cad大片在线观看| 日韩二区三区| 国产一区二区在线观看免费| 国产美女高潮久久白浆| 久久精品国产av一区二区三区| 亚洲国产欧美日韩在线观看第一区| 欧美成人国产一区二区| 日本xxxxxxx免费视频| 黄av在线播放| 99久久精品99国产精品| 国产精品视频久久久久| 欧美国产在线看| 一区二区美女| 亚洲人午夜色婷婷| 日本人妻一区二区三区| 国产高清不卡| 在线视频一区二区免费| 99久久99久久精品| 国产又色又爽又黄刺激在线视频| 国产偷国产偷精品高清尤物| 91嫩草国产在线观看| 日日噜噜噜噜人人爽亚洲精品| 欧美成人自拍| 国产视频精品免费播放| 免费欧美一级片| 91成人精品在线| 日韩av在线免费观看一区| 91小视频在线播放| 欧美日韩国产v| 亚洲一区av在线| 国内自拍在线观看| 激情av在线| 高跟丝袜欧美一区| 成人区一区二区| 麻豆网站在线看| 国产色爱av资源综合区| 中文一区一区三区免费| 91在线视频免费看| 久久先锋影音av鲁色资源| av资源站久久亚洲| 国产又粗又猛又爽又黄视频| 日日欢夜夜爽一区| 成人免费在线视频网站| 特黄视频在线观看| 成人看片黄a免费看在线| 成人精品在线观看| 日韩一级在线播放| 成人av免费网站| 国产精品久久久久久久小唯西川| 男女av在线| 91日韩精品一区| 国产在线精品一区二区三区| 性一交一乱一透一a级| 91麻豆国产精品久久| 99re99热| 成人免费视屏| 欧美性xxxx在线播放| 性久久久久久久久久久久久久| 青青伊人久久| 亚洲国产精品热久久| 亚洲香蕉中文网| 日韩精品不卡一区二区| 日韩中文字幕亚洲| 日韩免费黄色片| 亚洲男人影院| 国产不卡av在线| www.亚洲激情| 美女在线视频一区| 成人亲热视频网站| 你懂的视频在线免费| 亚洲一区在线免费观看| 午夜剧场高清版免费观看| 国产成年精品| 国产一区二区av| 亚洲第一精品在线观看 | 日韩一区二区福利| 可以免费看的av毛片| 高清视频一区二区| 男人的天堂视频在线| 免费网站成人| 色94色欧美sute亚洲线路一ni| 狠狠操精品视频| 国产在视频一区二区三区吞精| 欧美少妇xxx| 国产夫妻性爱视频| 欧美自拍偷拍| 欧美成人免费视频| 一区二区www| 成人午夜伦理影院| 中文字幕第50页| missav|免费高清av在线看| 亚洲aaa精品| 国产偷人视频免费| 日韩极品在线| 久久久久北条麻妃免费看| 国产女人被狂躁到高潮小说| 黑人精品欧美一区二区蜜桃| 宅男一区二区三区| 亚洲三级电影| 日韩国产精品一区| 国产精品久久久免费视频| 99riav久久精品riav| 日韩少妇内射免费播放| 偷拍一区二区| 国产精品777| 日韩精品黄色| 91精品婷婷国产综合久久性色| 先锋资源av在线| 波多野结衣一区| 国产精品视频免费在线观看| 999国产在线视频| 欧美丰满一区二区免费视频| 欧美成人三级伦在线观看| 亚洲另类自拍| 91精品久久久久久久久青青| 黄色在线播放网站| 欧美电影免费观看完整版| 久久久久无码精品国产sm果冻| 午夜视频一区| 国产精品你懂得| 国产黄色在线观看| 欧美大片顶级少妇| 国产福利拍拍拍| 国产网站一区二区| 视频区 图片区 小说区| av亚洲在线观看| 欧美亚洲视频在线观看| 艳妇乳肉豪妇荡乳av| 91色porny蝌蚪| 天天色综合天天色| 久久99性xxx老妇胖精品| 欧美福利小视频| 国产日韩一级片| 国产精品美女久久久久久| 日韩av一卡二卡三卡| 黄色成人精品网站| 99国产高清| 涩涩视频在线| 亚洲国产精品va在线| 538精品在线观看| 成人a区在线观看| 中文久久久久久| 免费短视频成人日韩| 成人一区二区电影| 中文字幕资源网在线观看免费 | xx欧美视频| 另类专区欧美制服同性| 中文字幕视频一区二区| 久久综合色天天久久综合图片| 另类小说第一页| 亚洲视频中文| 一本一道久久a久久综合精品| 一区二区乱码| 久久久久北条麻妃免费看| 完全免费av在线播放| 亚洲女人毛茸茸高潮| 日韩av在线播放中文字幕| 欧美久久电影| 欧美日韩视频免费观看| 亚洲人午夜色婷婷| 国产特级黄色片| 色偷偷一区二区三区| 性欧美成人播放77777| 国内精品伊人久久久久av影院| 久久久999视频| 欧美成人一区在线观看| 亚洲一区二区三区四区在线播放| 成人日韩欧美| 搡老女人一区二区三区视频tv| 国产一区二区三区在线观看| 色综合天天天天做夜夜夜夜做| 国产一级久久久| 亚洲欧美电影一区二区| 无码人妻丰满熟妇啪啪网站| 在线观看的日韩av| 成人久久久久久| va视频在线观看| 国产精品国产三级国产普通话三级 | 国产亚洲精品激情久久| 天天干天天干天天干| 日韩一卡二卡三卡国产欧美| 日本黄色免费片| 蜜桃一区二区三区四区| 91视频最新入口| 在线日韩欧美| 很污的网站在线观看| 欧洲精品一区| 国产精品日韩一区二区免费视频| 美女国产精品久久久| 韩剧1988免费观看全集| 在线āv视频| 九九热视频这里只有精品| 天堂网在线资源| 精品国产伦理网| 亚洲精品毛片一区二区三区| 欧美日韩美女在线| 亚洲综合一二三| 婷婷丁香久久五月婷婷| 91制片厂在线| 中文字幕亚洲综合久久菠萝蜜| 精品伦精品一区二区三区视频密桃| 国产高清亚洲一区| 99久久久无码国产精品6| 国产欧美精品久久| 91制片厂免费观看| 天天综合一区| 欧美乱偷一区二区三区在线| 日韩啪啪网站| 欧美国产视频在线观看| 国产精品片aa在线观看| 99c视频在线| 一区二区三区欧洲区| 极品日韩久久| 黄色成人小视频| 成人美女免费网站视频| 欧美特黄不卡| 国产伦理一区二区三区| 亚洲人成网站77777在线观看| 欧美一区二区在线| 黄色美女久久久| 91精品久久久久久久久久久久久| 性欧美又大又长又硬| 国产91色在线|免| 色8久久久久| 国产精品传媒毛片三区| 亚洲久草在线| 成人欧美一区二区三区视频| 美腿丝袜亚洲图片| 欧美一区二视频在线免费观看| 久久国产小视频| 无码人妻精品一区二区蜜桃网站| av不卡在线看| 白白操在线视频| 亚洲伦伦在线| 亚洲一区在线不卡| 高清不卡在线观看av| 在线观看日本中文字幕| av午夜一区麻豆| 免费成人深夜天涯网站| 久久奇米777| 翔田千里88av中文字幕| 精品久久久久久电影| 在线免费av片| 亚洲精品mp4| 欧美精品日韩少妇| 8x拔播拔播x8国产精品| 多野结衣av一区| 午夜精品久久久久久久男人的天堂| 欧美不卡高清一区二区三区| 福利视频久久| 久久高清免费| 亚洲午夜精品久久久久久人妖| 久久精品国产秦先生| 天天干天天av| 91色乱码一区二区三区| 欧美日韩三级在线观看| 91国偷自产一区二区使用方法| 午夜精品久久久久久久99老熟妇| 日韩一区二区三区观看| 每日更新在线观看av| 久久久久国产精品免费| www.综合| 91色精品视频在线| 欧洲大片精品免费永久看nba| 97超碰最新| 清纯唯美日韩| 日韩视频在线免费看| av电影在线观看一区| 免费中文字幕在线| 欧美日本一区二区三区| 国产美女永久免费| 亚洲深夜福利网站| mm视频在线视频| 91原创国产| 亚洲国产一成人久久精品| 人人干人人干人人| 久久久综合激的五月天| 在线免费观看a级片| 亚洲激情一二三区| 一区二区三区精| 尤物yw午夜国产精品视频明星| 无遮挡动作视频在线观看免费入口| 琪琪第一精品导航| 四虎在线精品| 亚洲精品永久www嫩草| 中文在线日韩| 欧美女人性生活视频| 成人动漫一区二区在线| 久久久久成人片免费观看蜜芽| 91精品国模一区二区三区| 3p在线观看| 国产精品亚洲精品| 成人免费看片39| 天堂av在线网站| 亚洲国产精品成人久久综合一区| 国产又粗又猛又黄视频| 日韩一区二区三区视频在线观看 | 久久久www免费人成精品| 欧美亚韩一区二区三区| 日韩电视剧在线观看免费网站 | 国产欧美一区二区三区视频| 日韩在线不卡| 欧美国产日韩另类| 亚洲狼人国产精品| www.狠狠干| 久久男人的天堂| 精品视频在线一区二区在线| 亚洲资源在线看| 欧美一区二区三区免费看| 麻豆传媒在线看| 亚洲国产视频一区| 中文精品久久久久人妻不卡| 亚洲色图综合网| 国精品产品一区| 大陆极品少妇内射aaaaaa| 成人综合激情网| 国产成人综合欧美精品久久| 制服丝袜亚洲色图| 欧美人体视频xxxxx| 国产精品亚洲一区二区三区| 91亚洲一区| 日本wwwxx| 色综合色狠狠综合色| 欧美精品hd| 国产伦精品一区二区三区四区视频 | 一区二区xxx| 亚洲激情av在线| 日韩一区二区三区中文字幕| 国产精品丝袜高跟| 国产专区一区| 欧美人妻一区二区三区| 91精品啪在线观看国产60岁| 高清在线视频不卡| 一区精品在线| 99久久伊人久久99| 一级爱爱免费视频| 午夜精品久久久久久久99热浪潮 | 日韩国产小视频| 久久久精品欧美丰满| 国产丝袜在线视频| 国产精国产精品| 好看的av在线不卡观看| 人妻aⅴ无码一区二区三区| 7777精品伊人久久久大香线蕉最新版| 丁香高清在线观看完整电影视频 | 在线免费看黄网站| 国产精品我不卡| 久久精品国产成人一区二区三区|