JavaScript設(shè)計(jì)模式:工廠,Singleton和Observer
Jul 29, 2025 am 01:39 AMFactory模式用於創(chuàng)建對(duì)象而不暴露構(gòu)造邏輯,通過統(tǒng)一接口生成不同類型對(duì)象,適用於創(chuàng)建多種相似類型對(duì)象的場(chǎng)景;2. Singleton模式確保一個(gè)類僅有一個(gè)實(shí)例並提供全局訪問點(diǎn),常用於配置管理、日誌器等需要單一狀態(tài)的場(chǎng)景;3. Observer模式建立一對(duì)多依賴關(guān)係,當(dāng)主體狀態(tài)變化時(shí)自動(dòng)通知所有觀察者,廣泛應(yīng)用於事件系統(tǒng)和數(shù)據(jù)綁定。這三種模式分別解決了對(duì)象創(chuàng)建、實(shí)例唯一性和狀態(tài)響應(yīng)的問題,結(jié)合使用可提升代碼的模塊化、可維護(hù)性和可擴(kuò)展性。
JavaScript 設(shè)計(jì)模式中的Factory 、 Singleton和Observer是三種非常實(shí)用且常見的模式,能幫助我們寫出更模塊化、可維護(hù)和可擴(kuò)展的代碼。下面分別介紹它們的用途、實(shí)現(xiàn)方式和使用場(chǎng)景。

1. Factory Pattern(工廠模式)
工廠模式用於創(chuàng)建對(duì)象,而無需暴露具體的構(gòu)造邏輯。它通過一個(gè)統(tǒng)一的接口來生成不同類型的對(duì)象,特別適合對(duì)象創(chuàng)建邏輯複雜或需要根據(jù)條件動(dòng)態(tài)決定類型的情況。
使用場(chǎng)景:
- 創(chuàng)建多種相似類型的對(duì)象(如不同類型的用戶、UI 組件等)
- 避免重複的
new
操作和條件判斷分散在代碼各處
示例代碼:
class Dog { speak() { return "Woof!"; } } class Cat { speak() { return "Meow!"; } } class AnimalFactory { createAnimal(type) { if (type === "dog") { return new Dog(); } else if (type === "cat") { return new Cat(); } throw new Error("Unknown animal type"); } } // 使用const factory = new AnimalFactory(); const dog = factory.createAnimal("dog"); const cat = factory.createAnimal("cat"); console.log(dog.speak()); // Woof! console.log(cat.speak()); // Meow!
?優(yōu)點(diǎn):解耦對(duì)象創(chuàng)建與使用,易於擴(kuò)展新類型。
2. Singleton Pattern(單例模式)
單例模式確保一個(gè)類只有一個(gè)實(shí)例,並提供一個(gè)全局訪問點(diǎn)。在JavaScript 中,由於對(duì)像是引用類型,實(shí)現(xiàn)單例相對(duì)簡(jiǎn)單。
使用場(chǎng)景:
- 全局配置管理
- 日誌記錄器(Logger)
- 數(shù)據(jù)庫(kù)連接池
- 狀態(tài)管理(如Redux store 本質(zhì)也是單例)
實(shí)現(xiàn)方式:
class Database { constructor() { if (Database.instance) { return Database.instance; } this.url = "localhost:3000"; Database.instance = this; return this; } connect() { console.log("Connected to DB at " this.url); } } // 使用const db1 = new Database(); const db2 = new Database(); console.log(db1 === db2); // true
?? 注意:構(gòu)造函數(shù)中判斷是否已存在實(shí)例,如果存在就返回已有實(shí)例,避免重複創(chuàng)建。
?優(yōu)點(diǎn):節(jié)約資源,保證全局狀態(tài)一致。
?注意:過度使用可能導(dǎo)致代碼難以測(cè)試或耦合度高。
3. Observer Pattern(觀察者模式)
觀察者模式定義了一種一對(duì)多的依賴關(guān)係,當(dāng)一個(gè)對(duì)象狀態(tài)改變時(shí),所有依賴它的對(duì)像都會(huì)自動(dòng)收到通知。它是事件系統(tǒng)和響應(yīng)式編程的基礎(chǔ)。
使用場(chǎng)景:
- 事件監(jiān)聽機(jī)制(如DOM 事件)
- 數(shù)據(jù)綁定(如Vue 的響應(yīng)式原理)
- 狀態(tài)管理中的訂閱更新
示例代碼:
class Subject { constructor() { this.observers = []; } subscribe(observer) { this.observers.push(observer); } unsubscribe(observer) { this.observers = this.observers.filter(obs => obs !== observer); } notify(data) { this.observers.forEach(observer => observer.update(data)); } } class Observer { constructor(name) { this.name = name; } update(data) { console.log(`${this.name} received:`, data); } } // 使用const subject = new Subject(); const observer1 = new Observer("Alice"); const observer2 = new Observer("Bob"); subject.subscribe(observer1); subject.subscribe(observer2); subject.notify("New message!"); // Alice received: New message! // Bob received: New message! subject.unsubscribe(observer1); subject.notify("Second message!"); // Bob received: Second message!
?優(yōu)點(diǎn):松耦合,支持動(dòng)態(tài)訂閱/取消,適合異步通信。
? 小技巧:現(xiàn)代JS 中可以用
EventTarget
或發(fā)布/訂閱(Pub/Sub)模式簡(jiǎn)化實(shí)現(xiàn)。
總結(jié)對(duì)比
模式 | 用途 | 核心思想 |
---|---|---|
Factory | 創(chuàng)建對(duì)象 | 封裝創(chuàng)建邏輯,統(tǒng)一接口 |
Singleton | 保證唯一實(shí)例 | 全局訪問僅一個(gè)實(shí)例 |
Observer | 狀態(tài)變化通知依賴者 | 發(fā)布-訂閱,自動(dòng)更新 |
這三種模式在實(shí)際項(xiàng)目中經(jīng)常結(jié)合使用。比如:
- 用Singleton管理全局狀態(tài)
- 用Observer監(jiān)聽狀態(tài)變化並刷新UI
- 用Factory動(dòng)態(tài)創(chuàng)建組件或服務(wù)
基本上就這些。掌握它們,能讓你的JavaScript 架構(gòu)更清晰,也更容易應(yīng)對(duì)複雜業(yè)務(wù)邏輯。
以上是JavaScript設(shè)計(jì)模式:工廠,Singleton和Observer的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

在Java框架中,設(shè)計(jì)模式和架構(gòu)模式的區(qū)別在於:設(shè)計(jì)模式定義了在軟體設(shè)計(jì)中解決常見問題的抽象解決方案,專注於類別和物件之間的交互,例如工廠模式。架構(gòu)模式定義了系統(tǒng)結(jié)構(gòu)和模組之間的關(guān)係,關(guān)注系統(tǒng)元件的組織和交互,如分層架構(gòu)。

TDD用於編寫高品質(zhì)PHP程式碼,步驟包括:編寫測(cè)試案例,描述預(yù)期功能並使其失敗。編寫程式碼,僅使測(cè)試案例通過,無需過度優(yōu)化或詳細(xì)設(shè)計(jì)。測(cè)試案例通過後,優(yōu)化和重構(gòu)程式碼以提高可讀性、可維護(hù)性和可擴(kuò)展性。

Guice框架應(yīng)用了多項(xiàng)設(shè)計(jì)模式,包括:?jiǎn)卫J剑和高^@Singleton註解確保類別只有一個(gè)實(shí)例。工廠方法模式:透過@Provides註解建立工廠方法,在依賴注入時(shí)取得物件實(shí)例。策略模式:將演算法封裝成不同策略類,透過@Named註解指定具體策略。

裝飾器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,允許動(dòng)態(tài)添加物件功能,無需修改原始類別。它透過抽象組件、具體組件、抽象裝飾器和具體裝飾器的協(xié)作實(shí)現(xiàn),可以靈活擴(kuò)展類別功能,滿足變化的需求。範(fàn)例中,將牛奶和摩卡裝飾器添加到Espresso,總價(jià)為2.29美元,展示了裝飾器模式在動(dòng)態(tài)修改物件行為方面的強(qiáng)大功能。

SpringMVC框架使用以下設(shè)計(jì)模式:1.單例模式:管理Spring容器;2.門面模式:協(xié)調(diào)控制器、視圖和模型互動(dòng);3.策略模式:根據(jù)請(qǐng)求選擇請(qǐng)求處理程序;4.觀察者模式:發(fā)布和監(jiān)聽?wèi)?yīng)用程式事件。這些設(shè)計(jì)模式增強(qiáng)了SpringMVC的功能和靈活性,使開發(fā)者可以創(chuàng)建高效、可維護(hù)的應(yīng)用程式。

Java框架中使用設(shè)計(jì)模式的優(yōu)點(diǎn)包括:程式碼可讀性、可維護(hù)性和可擴(kuò)充性增強(qiáng)。缺點(diǎn)包括:過度使用導(dǎo)致複雜性、效能開銷以及學(xué)習(xí)曲線陡峭。實(shí)戰(zhàn)案例:代理模式用於延遲載入物件。明智地使用設(shè)計(jì)模式可充分利用其優(yōu)勢(shì)並最小化缺點(diǎn)。

PHP設(shè)計(jì)模式提供了已知解決方案來應(yīng)對(duì)軟體開發(fā)中常見的問題。常見的模式類型包括創(chuàng)建型(例如工廠方法模式)、結(jié)構(gòu)型(例如裝飾器模式)和行為型(例如觀察者模式)。設(shè)計(jì)模式在解決重複性問題、提高可維護(hù)性和促進(jìn)團(tuán)隊(duì)合作時(shí)特別有用。在電商系統(tǒng)中,觀察者模式可以實(shí)現(xiàn)購(gòu)物車與訂單狀態(tài)之間的自動(dòng)更新。整體而言,PHP設(shè)計(jì)模式是創(chuàng)建健壯、可擴(kuò)展且可維護(hù)應(yīng)用程式的重要工具。

TDD與設(shè)計(jì)模式可提高程式碼品質(zhì)和可維護(hù)性。 TDD確保測(cè)試覆蓋率,提高可維護(hù)性,並提高程式碼品質(zhì)。設(shè)計(jì)模式透過鬆散耦合和高內(nèi)聚等原則協(xié)助TDD,確保測(cè)試涵蓋應(yīng)用程式行為的各個(gè)方面。它還透過可重用性,可維護(hù)性和更健壯的程式碼可提高可維護(hù)性和程式碼品質(zhì)。
