JS設計模式之單例模式

来源:https://www.cnblogs.com/niehang/archive/2019/03/20/10565765.html
-Advertisement-
Play Games

單例模式 單例模式的定義是:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。比如說購物車,在一個商城中,我們只需要一個購物車,購物車在整個商城中是唯一的,不需要多次創建,即使多次點擊購物車按鈕,也不會生成多個購物車。 閉包預警:有對閉包不明白的同學,可以 "看這裡" 。 讓我們實現一個單例模式 ...


單例模式

單例模式的定義是:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。比如說購物車,在一個商城中,我們只需要一個購物車,購物車在整個商城中是唯一的,不需要多次創建,即使多次點擊購物車按鈕,也不會生成多個購物車。

閉包預警:有對閉包不明白的同學,可以看這裡

讓我們實現一個單例模式吧

var Singleton = function(name) {
    this.name = name;
}

Singleton.getInstance = (function () {
  var instance = null;
  return function (name) {
    if (!instance) {
      instance = new Singleton(name);
    }
    return instance;
  }
})()

var single1 = Singleton.getInstance('張三');
var single2 = Singleton.getInstance('李四');

console.log(single1 === single2); // 輸出true

我們主要看一下Singleton.getInstance方法,其中將變數instance作為一個標誌,來確認是否創建過Singleton對象。如果沒有就創建一個Singleton對象,反之則返回之前創建過的對象。

這樣我們創建Singleton對象的時候,就得使用Singleton.getInstance方法,而不是使用new關鍵字來創建對象。如果想使用new關鍵字的話,可以這樣寫。

使用代理類來實現單例模式

var Singleton = function(name) {
  this.name = name;
}

var ProxySingleton = (function () {
  var instance = null;
  return function(name) {
    if (!instance) {
      instance = new Singleton(name);
    }
    return instance;
  }
})()

var single1 = new ProxySingleton('張三');
var single2 = new ProxySingleton('李四');

console.log(single1 === single2); // 輸出true

我們將管理單例的邏輯放入ProxySingleton這個代理類中,從而使Singleton變成一個普通的類或者構造函數。這樣我們就可以通過new關鍵字來創建對象。

創建對象和管理單例邏輯職責分離

var createObj = function(name, age) {
  return {
    name: name,
    age: age
  }
}

var getSingle = function(fn) {
  var instance = null;
  return function () {
    return instance || (instance = fn.apply(this, arguments));
  }
}

var CreateFn = getSingle(createObj);

var obj1 = CreateFn('張三', 18);
var obj2 = CreateFn('李四', 19);

console.log(obj1 === obj2); // 輸出true

這裡createObj方法負責創建對象和處理內部邏輯,getSingle方法只負責管理單例的邏輯。這樣在創建各種單例對象的情況下,使用更加靈活。也符合單一職責的開發原則。

單例模式的使用場景

單例模式的使用場景非常廣泛,這裡舉幾個

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue的組件,過濾器,監聽屬性,生命周期函數 vue有局部組件和全局組件,這個組件後期用的會比較多,也是非常重要的 局部組件 template與components屬性結合使用掛載 ...
  • 最簡單的解決辦法,不影響其他操作,給提交按鈕增加 type="button" 屬性 完美解決 ...
  • 近幾年,職場上歷經的激蕩與陣痛,比以往來得似乎更為猛烈一些。 近幾年,職場上歷經的激蕩與陣痛,比以往來得似乎更為猛烈一些。 近幾年,職場上歷經的激蕩與陣痛,比以往來得似乎更為猛烈一些。 近幾年,職場上歷經的激蕩與陣痛,比以往來得似乎更為猛烈一些。 2016年,亞馬遜員工平均31歲,谷歌員工均齡30歲 ...
  • 先判斷有沒有,沒有再創建,有就跳過 先判斷有沒有,沒有再創建,有就跳過 <input type="button" value="按鈕" id="btn"/> <div id="dv"></div> my$("btn").onclick=function () { //判斷這個按鈕的子元素是否存在 i ...
  • Web前端 Vue.js必備框架(五) 頁面組件,商品列表組件,詳情組件,購物車清單組件,結算頁組件,訂單詳情組件,訂單列表組件。 下載: 使用 腳手架搭建項目 引入 ,它是為 開發的狀態管理模式,採用集中式存儲管理應用的所有組件的狀態,以相應的規則保證狀態以一種可預測的方式發生變化。 計算屬性 數 ...
  • 1.介紹promise和模仿Promise.all和Promise.race promise的設計主要是解決回調地獄(接收結果用回調函數來處理,但必須傳入回調函數)的問題,由一層層嵌套回調函數改為由then來執行。 例如: // callback用於接收返回結果, 非同步方式 fs.readFile( ...
  • 一. async/await 相對 promise 的優勢 擁有更通用的作用域,使得代碼有更好的易讀性和可維護性。 由於其鏈式調用,每一個函數都有自己的作用域,如果在多層鏈式調用的層級中,相隔兩層的鏈需要有相互依賴關係,則需要額外的參數傳遞。 場景如下: 假設有 p1 、 p2 、 p3 三個非同步操 ...
  • 解決方案: 增加success回調及其內容 如下: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...