← Back to Blog

Singleton

Singleton pattern - Create only one instance on the application lifecycle.

Singleton

The Singleton pattern is different from the Single Responsibility principle defined in SOLID. The Singleton pattern is a design pattern that ensures the use of only one instance of a class (1 object - 1 class).

Avoid re-create instance

Problems

Addressing two issues at once:

  • Ensure that a class has just a single instance

    • Manages the number of instances created in the system to control resource sharing within the system.
    • Instead of creating a new instance every time it’s used, each access will retrieve the previously created instance.
  • Provide a global access point to that instance

    • Since this pattern involves initializing the instance once and using it in multiple places, considering it as a global variable is not incorrect.

Solution

  • Make the constructor a private function.
  • Create a static function that acts as a creation function instead of the constructor.

Peseudocode

class Singleton {
  public static instance: Singleton;
  public variable: string;
  private constructor() {
    this.variable = "initialized";
  }

  public static getInstance() {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}

const hello = Singleton.getInstance();
const hi = Singleton.getInstance();
console.log(hello.variable === hi.variable); // true

Example

class Database {
  private static instance: Database;
  private constructor() {}

  public static getInstance(): Database {
    if (!this.instance) {
      this.instance = new Database();
    }
    return this.instance;
  }
}

const db = Database.getInstance();
const db2 = Database.getInstance();
console.log(db === db2);

Applicability

  • Use when you want a class to have only one instance in the system, such as: database, connector to a 3rd party.
  • Use when you want to tightly control global variables, ensuring the entire system shares a single instance.
ProsCons
Ensures there is only a single instance of a class.However, maintaining and debugging can be difficult in multi-threaded scenarios.
The object is created only on the first access.This may violate the single responsibility principle.
It is challenging to write unit tests for client code.

References

Related posts

Design Patterns
Design pattern
Design Patterns
[Structural] Bridge
Design Patterns
[Structural] Composite
← Back to Blog