說說你對單例模式的理解?如何實現?

在這里插入圖片描述

一、是什么

單例模式(Singleton Pattern):創建型模式,提供了一種創建對象的最佳方式,這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建

在應用程序運行期間,單例模式只會在全局作用域下創建一次實例對象,讓所有需要調用的地方都共享這一單例對象,如下圖所示:
在這里插入圖片描述
從定義上來看,全局變量好像就是單例模式,但是一般情況我們不認為全局變量是一個單例模式,原因是:

  • 全局命名污染
  • 不易維護,容易被重寫覆蓋

二、實現

在javascript中,實現一個單例模式可以用一個變量來標志當前的類已經創建過對象,如果下次獲取當前類的實例時,直接返回之前創建的對象即可,如下:

// 定義一個類
function Singleton(name) {this.name = name;this.instance = null;
}
// 原型擴展類的一個方法getName()
Singleton.prototype.getName = function() {console.log(this.name)
};
// 獲取類的實例
Singleton.getInstance = function(name) {if(!this.instance) {this.instance = new Singleton(name);}return this.instance
};// 獲取對象1
const a = Singleton.getInstance('a');
// 獲取對象2
const b = Singleton.getInstance('b');
// 進行比較
console.log(a === b);

使用閉包也能夠實現,如下:

function Singleton(name) {this.name = name;
}
// 原型擴展類的一個方法getName()
Singleton.prototype.getName = function() {console.log(this.name)
};
// 獲取類的實例
Singleton.getInstance = (function() {var instance = null;return function(name) {if(!this.instance) {this.instance = new Singleton(name);}return this.instance}        
})();// 獲取對象1
const a = Singleton.getInstance('a');
// 獲取對象2
const b = Singleton.getInstance('b');
// 進行比較
console.log(a === b);

也可以將上述的方法稍作修改,變成構造函數的形式,如下:

// 單例構造函數
function CreateSingleton (name) {this.name = name;this.getName();
};// 獲取實例的名字
CreateSingleton.prototype.getName = function() {console.log(this.name)
};
// 單例對象
const Singleton = (function(){var instance;return function (name) {if(!instance) {instance = new CreateSingleton(name);}return instance;}
})();// 創建實例對象1
const a = new Singleton('a');
// 創建實例對象2
const b = new Singleton('b');console.log(a===b); // true

三、使用場景

在前端中,很多情況都是用到單例模式,例如頁面存在一個模態框的時候,只有用戶點擊的時候才會創建,而不是加載完成之后再創建彈窗和隱藏,并且保證彈窗全局只有一個

可以先創建一個通常的獲取對象的方法,如下:

const getSingle = function( fn ){let result;return function(){return result || ( result = fn .apply(this, arguments ) );}
}; 

創建彈窗的代碼如下:

const createLoginLayer = function(){var div = document.createElement( 'div' );div.innerHTML = '我是浮窗';div.style.display = 'none';document.body.appendChild( div );return div;
}; const createSingleLoginLayer = getSingle( createLoginLayer ); document.getElementById( 'loginBtn' ).onclick = function(){var loginLayer = createSingleLoginLayer();loginLayer.style.display = 'block';
};

上述這種實現稱為惰性單例,意圖解決需要時才創建類實例對象

并且Vuex、redux全局態管理庫也應用單例模式的思想,如下圖:

在這里插入圖片描述

現在很多第三方庫都是單例模式,多次引用只會使用同一個對象,如jquery、lodash、moment…

參考文獻

  • https://zh.wikipedia.org/zh-hans/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F
  • https://www.runoob.com/design-pattern/singleton-pattern.html
  • https://juejin.cn/post/6844903874210299912#heading-5

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文檔,大家一起討論學習,一起進步。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19724.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day23--單元測試-反射-注解-動態代理

day23-單元測試、反射 恭喜同學們,Java主要的知識我們其實已經學習得差不多了。今天同學們再把單元測試、反射、注解、動態代理學習完。Java的基礎知識就算全齊活了。 首先,我們進入單元測試的學習。 一、單元測試 1.1 單元測試快速入門 所謂單元測…

北斗消防系統實現林海無信號應急通信,高效防災救災開拓應急救援新通道

最近,貴州多地爆發的重大山火,火勢 21日這12天里,貴州發生森林火情221起,當地包括武警、消防、專業救援隊伍等在內的9千多人連續撲救,1.5萬名基層黨員干部、民兵、群眾及志愿者協助救火。目前,貴州全省火災…

OSPF狀態機+SPF算法

OSPF狀態機 1.點到點網絡類型 down-->init-->(前提為可以建立鄰接)exstart——>exchange-->若查看鄰接的DBD 目錄后發現不用進行LSA 直接進入ful。若查看后需要進行查詢、應答先進入loading,在查詢應答完后再進入 fuIl: 2.MA網絡類型 down --&g…

【計算機網絡】——概述(圖文并茂)

概述 一.信息時代的計算機網絡二.互聯網概述1.網絡,互連網,互聯網(因特網)1.網絡2.互連網3.互聯網(因特網) 2.互聯網簡介1.互聯網發展的三個階段2.互聯網服務提供者(ISP)3.互聯網的組…

HTTP/超文本傳輸協議(Hypertext Transfer Protocol)及HTTP協議通信步驟介紹和請求、響應階段詳解;

目錄 一、HTTP/超文本傳輸協議 特點和功能 請求-響應模型 版本和擴展 安全性和加密 二、HTTP協議通信步驟介紹 三、請求、響應階段詳解 HTTP請求 HTTP響應 示例 一、HTTP/超文本傳輸協議 HTTP/超文本傳輸協議(Hypertext Transfer Protocol)是…

淺談人機交互

人機交互(Human-Computer Interaction,HCI),是指關于設計、評價和實現供人們使用的交互式計算機系統,并圍繞相關的主要現象進行研究。 狹義的講,人機交互技術主要是研究人與計算機之間的信息交換&#xff0…

wpf窗體背景鏡像漸變效果實現

<Window.Background> <!--鏡像漸變--> <RadialGradientBrush Center"0.5,0" GradientOrigin"0.5,-0.5" RadiusX"0.7" RadiusY"1.2"> <GradientStop Color"#ff61baff" Offset"0&q…

【康耐視國產案例】智能AI相機:深度解析DataMan 380大視野高速AI讀碼硬實力

隨著讀碼器技術的不斷更新迭代&#xff0c;大視野高速應用成為當前工業讀碼領域的關鍵發展方向。客戶對大視野高速讀碼器的需求源于其能顯著減少生產成本并提升工作效率。然而&#xff0c;大視野應用場景往往伴隨著對多個條碼的讀取需求&#xff0c;這無疑增加了算法的處理負擔…

cuda 11.6 pytorch安裝

在安裝之前&#xff0c;需要先配置GPU環境&#xff08;安裝CUDA和CudaNN) 命令行輸入nvidia-smi&#xff0c;查看驅動信息 nvidia-smi 安裝相應的CUDA 和CUDANN 驗證&#xff1a;輸入nvcc --version 或者nvcc -V 進行檢查 nvcc --version nvcc -V 在anaconda里創建環境 co…

NLP課程筆記-基于transformers的自然語言處理入門

toc 項目地址 https://github.com/datawhalechina/learn-nlp-with-transformers/ 2017年&#xff0c;Attention Is All You Need論文&#xff08;Google Brain&#xff09;首次提出了Transformer模型結構并在機器翻譯任務上取得了The State of the Art(SOTA, 最好)的效果。2…

ADB安裝教程

1 adb簡介 Android 調試橋 (adb) 是一種功能多樣的命令行工具&#xff0c;可讓您與設備進行通信。 adb命令可用于執行各種設備操作&#xff0c;例如安裝和調試應用。 adb 提供對 Unix shell&#xff08;可用來在設備上運行各種命令&#xff09;的訪問權限。它是一種客戶端-服務…

一篇文章帶你弄懂Java集合的泛型

目錄 第一問&#xff1a;什么是泛型&#xff1f;有什么好處&#xff1f; 第二問&#xff1a;泛型是如何實現的呢&#xff1f; 第三問&#xff1a;類型擦除的缺點有哪些&#xff1f; 第四問&#xff1a;泛型中上下界限定符extends和super有什么區別&#xff1f; 第五問&…

HR人才測評,如何做中層管理人員的素質測評?

中層管理人員是企業中的重要力量&#xff0c;他們是連接高層管理和基層員工的橋梁&#xff0c;對企業的發展至關重要。因此&#xff0c;對中層管理人員的素質測評尤為重要。下面&#xff0c;我將介紹一些HR人才測評的方法和步驟&#xff0c;以幫助企業準確評估中層管理人員的素…

中信銀行積極開展2024年金融科技活動周宣傳活動

近日&#xff0c;2024年全國金融“科技活動周”正式啟動。中信銀行圍繞“弘揚科學家精神 激發全社會創新活力”為主題&#xff0c;積極面向公眾宣傳各類金融知識&#xff0c;全面營造熱愛科學、崇尚科學的社會氛圍。 自5月25日起&#xff0c;中信銀行通過全國網點大屏播放宣傳…

【C++】77組合

給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 使用回溯算法。我們可以按照以下步驟來實現&#xff1a; 創建一個輔助函數 backtrack&#xff0c;用來進行回溯搜索。其中包括當前組合的狀態變量 current、起始…

C# list集合

一、list集合基本使用 1.添加元素 ① 單個元素添加 List<int> list new List<int>();for (int i 0; i < 3; i){list.Add(i);}//輸出&#xff1a;0,1,2 ②初始化時添加元素 List<int> list2 new List<int> { 1, 2, 3 };//輸出&#xff1a;0,1…

Jenkins從放棄到入門:部署、配置與應用

目錄 Jenkins詳解 一、Jenkins介紹 1、Jenkins 功能 2、Jenkins 概念 3、Jenkins 目的 4、Jenkins 特性 5、產品發布流程 二、Jenkins CI/CD 流程 三、部署Jenkins git 1、jenkins 安裝 yum 安裝 jenkins *jenkins 依賴 java 環境 #注意2.346之后的版本不再支持jdk…

RabbitMQ-發布/訂閱模式

1、發布/訂閱模式介紹 在普通的生產者、消費者模式&#xff0c;rabbitmq會將消息依次傳遞給每一個消費者&#xff0c;一個worker一個&#xff0c;平均分配&#xff0c;這就是Round-robin調度方式&#xff0c;為了實現更加復雜的調度&#xff0c;我們就需要使用發布/訂閱的方式…

EXSI虛擬機新增磁盤并將空間擴充到已有分區

這里寫自定義目錄標題 1、在EXSI虛擬機中新增一塊磁盤配置大小2、確認新磁盤3、格式化新分區4、添加新分區到LVM5、將新增分區添加到已有分區里 1、在EXSI虛擬機中新增一塊磁盤配置大小 注意事項&#xff1a; (1)需確保虛擬機已關閉活處于維護模式&#xff0c;避免數據丟失 (2…

Spring Boot詳解:深入了解與實踐

文章目錄 1. Spring Boot簡介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的歷史背景1.3 Spring Boot的核心特點 2. Spring Boot的核心概念2.1 自動配置2.1.1 自動配置原理2.1.2 自定義配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模塊3.1…