跳至主要内容

Singleton Design Pattern

定義

在此設計模式下,一個 class 僅能創建一個實例,而且它是全域的,不同元件皆能一起共享此實例。

優點

  • 確保 class 只會建立唯一一個實例,避免資源浪費、節省記憶體
  • 提供一個全域入口存取此實例:任何地方都可輕鬆存取,不需仰賴變數傳遞

缺點

  • 隱藏依賴:因為存取入口是全域的,容易忽略模組與模組之間的依賴關係。

實作

let instance;
let globalState = {
data: 'Hello world',
};

class Singleton {
constructor() {

//防止創建多個實例
if (instance) {
throw new Error('You can only create one instance!');
}
instance = this;
}
getPropByName(name) {
return globalState[name];
}
setPropByName(name, value) {
globalState[name] = value;
}
}
//Object.freeze() 來防止誤改物件的 property 和 method。
const singletonA = Object.freeze(new Singleton());

應用舉例

React 內建的 React Context 以及 Redux 是狀態管理的好夥伴,而它們的概念類似 Singleton,但不同的是常見的 React 狀態管理工具都是「唯讀(readonly)」,不像 Singleton 是 mutable。

Resources

https://www.freecodecamp.org/news/singleton-design-pattern-with-javascript/