JavaScript 創建型設計模式詳解

1. 單例模式

1.1. 使用場景

在前端開發中,全局狀態管理、配置信息、數據庫連接等往往需要在應用中只存在一個實例,避免多次實例化帶來的數據不一致性。例如,在一個前端應用中,全局的 loading 狀態通常需要一個單例模式來確保其唯一性。

1.2. 代碼實現

class Singleton {// 構造函數為私有,防止外部直接調用constructor() {if (Singleton.instance) {return Singleton.instance;}// 初始化其他屬性this.data = [];Singleton.instance = this;}// 靜態方法,獲取唯一的實例static getInstance() {if (!Singleton.instance) {Singleton.instance = new Singleton();}return Singleton.instance;}// 添加數據方法addData(item) {this.data.push(item);}// 獲取數據方法getData() {return this.data;}
}// 使用 Singleton
const instance1 = Singleton.getInstance();
instance1.addData('First Item');const instance2 = Singleton.getInstance();
console.log(instance2.getData()); // ['First Item'], instance1 和 instance2 是同一個實例

1.3.?詳細注釋

  • constructor():將構造函數私有化,通過判斷 Singleton.instance 是否已存在來確保單例。

  • getInstance():靜態方法用于獲取唯一實例,調用時如果實例不存在則創建新實例,存在則直接返回已有實例。

  • 使用 addData 和 getData 方法演示單例模式下的數據存儲與獲取,保證所有調用的是同一個實例。

1.4.?實際應用

  • 單例模式可用于前端中的全局配置對象、全局狀態管理(如 Redux Store)、全局事件總線等。

2. 工廠方法模式

2.1.?使用場景

當我們需要創建不同類型的對象但又不想在代碼中寫死實例化的邏輯時,工廠方法模式能夠根據條件動態生成合適的對象實例。在前端開發中,常用于根據不同配置生成相應的組件或對象。

2.2. 代碼實現

class Button {constructor(type) {this.type = type;}render() {console.log(`Render a ${this.type} button`);}
}class ButtonFactory {createButton(type) {switch (type) {case 'primary':return new Button('primary');case 'secondary':return new Button('secondary');default:throw new Error('Button type not supported');}}
}// 使用工廠方法
const factory = new ButtonFactory();
const primaryButton = factory.createButton('primary');
primaryButton.render(); // Render a primary button

2.3.?詳細注釋

  • Button:表示一個具體的按鈕對象,通過 type 來區分不同類型的按鈕。

  • ButtonFactory:工廠類用于創建不同類型的按鈕對象,提供了 createButton 方法,根據傳入的 type 動態生成對應的實例。

  • 通過工廠方法來解耦實例化邏輯和對象使用,便于擴展。

2.4.?實際應用

  • 工廠方法模式常用于創建復雜的對象實例,例如組件庫中的動態組件生成、API 服務實例化等。

3. 抽象工廠模式

3.1.?使用場景

當需要創建一組相關或相互依賴的對象時,抽象工廠模式能幫助我們統一創建流程。在前端框架中,常用于根據環境或用戶設置來創建不同的一組 UI 組件或工具。

3.2. 代碼實現

class MacButton {render() {console.log('Render a Mac button');}
}class WindowsButton {render() {console.log('Render a Windows button');}
}class MacFactory {createButton() {return new MacButton();}
}class WindowsFactory {createButton() {return new WindowsButton();}
}function createUI(factory) {const button = factory.createButton();button.render();
}// 使用抽象工廠
const macFactory = new MacFactory();
createUI(macFactory); // Render a Mac buttonconst windowsFactory = new WindowsFactory();
createUI(windowsFactory); // Render a Windows button

3.3.?詳細注釋

  • MacButton 與 WindowsButton:表示不同平臺下的按鈕組件。

  • MacFactory 與 WindowsFactory:各自負責創建相應平臺的組件,通過 createButton 方法創建相應的按鈕對象。

  • 通過抽象工廠模式,確保了創建一整套相關聯對象的流程簡單統一。

3.4.?實際應用

  • 抽象工廠模式廣泛用于創建跨平臺 UI 組件、表單控件等場景。

4. 建造者模式

4.1.?使用場景

當一個對象的創建需要依賴多個步驟或者多個部分時,建造者模式能通過逐步構建的方式來確保創建流程的清晰和可控。適合在前端復雜組件的創建中使用,例如動態表單、復雜配置對象等。

4.2. 代碼實現

class Form {constructor() {this.fields = [];}addField(field) {this.fields.push(field);}getForm() {return this.fields;}
}class FormBuilder {constructor() {this.form = new Form();}addTextField(label) {this.form.addField({ type: 'text', label });return this;}addCheckboxField(label) {this.form.addField({ type: 'checkbox', label });return this;}build() {return this.form;}
}// 使用建造者模式
const formBuilder = new FormBuilder();
const form = formBuilder.addTextField('Name').addCheckboxField('Subscribe').build();console.log(form.getForm()); // [{type: 'text', label: 'Name'}, {type: 'checkbox', label: 'Subscribe'}]

4.3.?詳細注釋

  • Form:表示表單對象,包含表單字段的數組。

  • FormBuilder:提供了一系列方法,用于動態添加表單字段,通過 build 方法返回構建好的表單。

  • 通過建造者模式,可以靈活地構建復雜對象,同時保持代碼的簡潔和可讀性。

4.4.?實際應用

  • 建造者模式常用于創建多步驟配置的對象,如復雜的 UI 組件、表單生成器、配置對象等。

5. 原型模式

5.1.?使用場景

當我們需要快速創建對象的副本時,原型模式可以通過拷貝已有對象來避免重復的初始化操作。常用于需要大量類似對象的場景,如渲染大量類似的 UI 組件或節點。

5.2. 代碼實現

class Prototype {constructor(data) {this.data = data;}clone() {return new Prototype(this.data);}
}// 使用原型模式
const original = new Prototype({ name: 'Original' });
const clone = original.clone();console.log(original.data); // { name: 'Original' }
console.log(clone.data); // { name: 'Original' }
console.log(original === clone); // false

5.3.?詳細注釋

  • Prototype:表示原型對象,提供了 clone 方法用于創建對象的副本。

  • clone():返回一個新對象,拷貝了原對象的數據,實現了對象的快速復制。

  • 原型模式避免了重新創建和初始化對象的復雜性。

5.4.?實際應用

  • 原型模式常用于需要大量創建相似對象的場景,如游戲開發中的對象克隆、前端應用中的組件渲染等。

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

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

相關文章

k8s除了主server服務器可正常使用kubectl命令,其他節點不能使用原因,以及如何在其他k8s節點正常使用kubectl命令??

kubectl 并不是“只能”在主節點(Control Plane Node)使用,而是因為它需要訪問 Kubernetes 的 kube-apiserver,而 kube-apiserver 通常只在主節點上運行并監聽內部網絡。簡單來說kubectl 需要連接 kube-apiserver!&…

Custom SRP - Complex Maps

https://catlikecoding.com/unity/tutorials/custom-srp/complex-maps/1 創建材質球我們的材質已經支持光照,并且支持 Albedo 和 Emission 貼圖.創建材質球,并應用下面的電路板的圖分別作為 albedo emission設置材質球的金屬度為 1 , 光滑度為 0.952 Mask Map在 albedo 圖上的不…

repo 學習教程

你現在會用 git 了,接下來學 repo(Google 推出來的多倉庫管理工具),其實就是在 Git 的基礎上做了一層封裝,方便同時管理很多 Git 倉庫。像 Android 源碼、Rockchip 全套 SDK 都是靠 repo 來拉取和管理的。 我給你分幾個…

[SWERC 2020] Safe Distance題解

[SWERC 2020] Safe Distance 題意 給定 NNN 個點與一個坐標 (X,Y)(X,Y)(X,Y),求從點 (0,0)(0,0)(0,0) 到點 (X,Y)(X,Y)(X,Y) 規劃一條路線,不能走出 (0,0)(0,0)(0,0) 與 (X,Y)(X,Y)(X,Y) 間形成的矩形,使得通過這條路線時距離最近的點的距離…

Rewind-你人生的搜索引擎

本文轉載自:Rewind-你人生的搜索引擎 - Hello123工具導航 ** 一、🔍 Rewind 是什么?你的數字記憶增強神器 Rewind 是一款人工智能驅動的個人記憶助手,就像為你配備了一個「數字第二大腦」。它能自動記錄、保存并索引你在電腦和手…

開發小點 - 存

開發小點 1.Req注解 EqualsAndHashCode(callSuper true) Data public class BillSituationReq extends BillQueryReq {/*** Whether to display the ring ratio, default is not displayed*/ApiModelProperty("Whether to Display YoY Comparison")private Boolean …

只會npm install?這5個隱藏技巧讓你效率翻倍!

原文鏈接:https://mp.weixin.qq.com/s/nijxVWj-E5U08DX2fl3vgg最近有個剛學前端的小伙伴問我:“為什么我的node_modules這么大?為什么別人裝依賴那么快?npx到底是啥玩意兒?” 相信不少人都跟他一樣,對npm的…

(二).net面試(static)

文章目錄項目地址一、基礎501.1 new keyword1.2 static class vs. static method1. static class2. static method3. static constructor 靜態構造函數4. 靜態成員的生命周期1.3 LinQ1.what is LinQ2. List<T>、IEnumerable<T>、IQueryable<T>3. 在數據庫里用…

docker,本地目錄掛載

理解Docker本地目錄掛載的基本概念Docker本地目錄掛載允許容器與宿主機共享文件或目錄&#xff0c;實現數據持久化和實時交互。掛載方式分為bind mount和volume兩種&#xff0c;前者直接映射宿主機路徑&#xff0c;后者由Docker管理存儲路徑。本地目錄掛載的核心方法bind mount…

IO多路復用相關知識

select、poll、epoll 在傳入的性能差異是不是體現在&#xff0c;當有新的連接過來&#xff0c;此時需要將新的fd傳入到內核中&#xff0c;但是poll/select需要出入整個數組&#xff0c;而epoll方式只需要出入單個fd&#xff1f; 1. select/poll 的情況它們沒有內核中“長期保存…

【CF】Day139——雜題 (絕對值變換 | 異或 + 二分 | 隨機數據 + 圖論)

B. Meeting on the Line題目&#xff1a;思路&#xff1a;數形結合首先考慮如果沒有 t 的影響該怎么寫顯然我們就是讓最大時間最小化&#xff0c;那么顯然選擇最左端點和最右端點的中間值即可&#xff0c;即 (mi mx) / 2&#xff0c;那么現在有了 t 該怎么辦我們不妨考慮拆開絕…

在 Ubuntu 上安裝和配置 PostgreSQL 實錄

一、查看ubuntu版本 lsb_release -a postgresq盡量安裝在新的穩定版本的ubuntu上 二、安裝postgresql 2.1 直接安裝 sudo apt install postgresql 結果如下 2.2 使用PPA源安裝 Ubuntu官方源提供了PostgreSQL的PPA(Personal Package Archive),通過PPA源安裝可以確保獲取…

WebGIS三維可視化 + 數據驅動:智慧煤倉監控系統如何破解煤炭倉儲行業痛點

目錄 一、項目背景&#xff1a;煤炭倉儲管理的痛點與轉型需求 二、建設意義&#xff1a;從 “被動管理” 到 “主動掌控” 的價值躍遷 三、項目核心&#xff1a;技術架構與核心目標的深度融合 四、數據與技術&#xff1a;系統穩定運行的 “雙支柱” &#xff08;一&#x…

使用 Spring Security 實現 OAuth2:一步一步的操作指南

前言 OAuth 是一種授權框架&#xff0c;用于創建權限策略&#xff0c;并允許應用程序對用戶在 HTTP 服務&#xff08;如 GitHub 和 Google&#xff09;上的賬戶進行有限訪問。它的工作原理是允許用戶授權第三方應用訪問他們的數據&#xff0c;而無需分享他們的憑證。本文將指導…

VMware共享文件夾設置

啟用共享文件夾 編輯虛擬機設置-選項-共享文件夾&#xff0c;上面的選項選擇啟用下面點擊添加一個路徑&#xff0c;跟著向導走 設置共享文件夾在主機的路徑&#xff0c;和文件夾名稱添加完成后可以點擊這個共享文件夾條目&#xff0c;查看屬性虛擬機里安裝vm-tools sudo apt up…

華為云昇騰云服務

華為云&#xff0c;一切皆服務共建智能世界云底座面向未來的智能世界&#xff0c;數字化是企業發展的必由之路。數字化成功的關鍵是以云原生的思維踐行云原生&#xff0c;全數字化、全云化、AI驅動&#xff0c;一切皆服務。華為云將持續創新&#xff0c;攜手客戶、合作伙伴和開…

Axum 最佳實踐:如何構建優雅的 Rust 錯誤處理系統?(三)

引言 作為開發者&#xff0c;我們都經歷過這樣的場景&#xff1a;項目上線后&#xff0c;你打開日志監控&#xff0c;鋪天蓋地的 500 Internal Server Error 撲面而來。這些錯誤像個黑洞&#xff0c;吞噬著你的調試時間&#xff0c;你甚至不知道它們是從數據庫查詢失敗&#x…

MySQL高可用方案解析:從復制到云原生

MySQL 的高可用 (High Availability, HA) 方案旨在確保數據庫服務在硬件故障、軟件崩潰、網絡中斷或計劃維護時仍能持續可用&#xff0c;最小化停機時間&#xff08;通常目標為 99.9% 至 99.999% 可用性&#xff09;。以下是 MySQL 領域成熟且廣泛應用的幾種主流高可用方案&…

騰訊云語音接口實現會議系統

1.前言 在現代企業協作環境中&#xff0c;高效的會議管理是提升團隊生產力的關鍵。本文將深入解析一個完整的會議管理系統&#xff0c;涵蓋從會議創建到總結生成的完整生命周期。該系統構建一個基于AI技術的智能會議系統&#xff0c;實現會議全流程的智能化管理&#xff0c;包括…

【LeetCode 每日一題】1277. 統計全為 1 的正方形子矩陣

Problem: 1277. 統計全為 1 的正方形子矩陣 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(m * n)空間復雜度&#xff1a;O(m * n)整體思路 這段代碼旨在解決一個經典的二維矩陣問題&#xff1a;統計全為 1 的正方形子矩陣個數 (Count Square Submatrices with …