Singleton Pattern — Design Patterns

Singleton Pattern memastikan sebuah class hanya punya satu instance di seluruh aplikasi, dan menyediakan akses global ke instance tersebut. Analogi: Presiden…

Singleton Pattern memastikan sebuah class hanya punya satu instance di seluruh aplikasi, dan menyediakan akses global ke instance tersebut.

Analogi: Presiden suatu negara. Hanya ada 1 presiden aktif pada satu waktu. Semua orang merujuk ke presiden yang sama.

Masalah yang diselesaikan:

Implementasi di JavaScript:

class Database {
  constructor() {
    if (Database.instance) {
      return Database.instance;
    }
    this.connection = "postgresql://localhost:5432/mydb";
    this.queries = [];
    Database.instance = this;
  }

  query(sql) {
    this.queries.push(sql);
    console.log(`Executing: ${sql}`);
    return { rows: [] };
  }

  getStats() {
    return { totalQueries: this.queries.length };
  }
}

const db1 = new Database();
const db2 = new Database();
console.log(db1 === db2); // true — sama persis!

db1.query("SELECT * FROM users");
console.log(db2.getStats()); // { totalQueries: 1 }

Cara lebih sederhana — Module Singleton:

// config.js — ES Module otomatis singleton!
let instance = null;

function createConfig() {
  return {
    apiUrl: "https://api.example.com",
    timeout: 5000,
    debug: false
  };
}

export function getConfig() {
  if (!instance) {
    instance = createConfig();
  }
  return instance;
}

Di JavaScript, ES Modules sudah singleton by default. Saat kamu import module, Node.js meng-cache hasilnya. Import kedua kali mendapat object yang sama.

// logger.js
const logs = [];
export function log(msg) { logs.push(msg); console.log(msg); }
export function getLogs() { return [...logs]; }

// file-a.js
import { log } from "./logger.js";
log("dari file A");

// file-b.js
import { getLogs } from "./logger.js";
console.log(getLogs()); // ["dari file A"] — shared state!

Singleton di dunia nyata:

Peringatan: