Heim > Web-Frontend > js-Tutorial > Singleton-Entwurfsmuster: Globale Zustände in Ihren Anwendungen verwalten

Singleton-Entwurfsmuster: Globale Zustände in Ihren Anwendungen verwalten

Susan Sarandon
Freigeben: 2024-12-03 19:34:15
Original
420 Leute haben es durchsucht

Haben Sie jemals mit einem Objekt zu tun gehabt, das von mehreren Teilen Ihrer Anwendung gemeinsam genutzt werden muss – vielleicht einer Datenbankverbindung, einem WebSocket-Client oder einem Konfigurationsmanager?

Wie verwaltet man ein solches Objekt, damit es während des gesamten Anwendungs- oder Prozesslebenszyklus konsistent und zugänglich bleibt? Hier kommt das Singleton Design Pattern ins Spiel.

Überblick

Singleton ist ein kreatives Designmuster, eine Kategorie von Designmustern, die sich mit den verschiedenen Problemen befasst, die mit der nativen Art der Objekterstellung mit dem Neuen einhergehen Schlüsselwort oder Operator.

Das Singleton Design Pattern konzentriert sich auf die Lösung von zwei Hauptproblemen:

  1. Wie können wir einen globalen Zugangspunkt zu unserer Instanz bereitstellen?
  2. Wie können wir sicherstellen, dass eine Klasse oder ein bestimmter Objekttyp nur eine Instanz hat?

Es kann die Art und Weise vereinfachen und standardisieren, wie wir eine bestimmte Art oder einen bestimmten Typ von globalen Zuständen verwalten, z. B. Datenbankverbindungen, WebSocket-Clients, Caching-Dienste oder alles, was wir während des gesamten Anwendungslebenszyklus im Speicher beibehalten und verändern müssen.

Wie können wir das Singleton Design Pattern implementieren?

Singleton Design Pattern: Managing Global States in Your Applications

Das obige Schema wird in diese TypeScript-Klasse übersetzt:

TypeScript-Beispiel

class Singleton {
  private static instance: Singleton
  // other properties...
  public authorName: string

  private constructor({ authorName }: { authorName: string }) {
    this.authorName = authorName
  }

  public static getInstance(params) {
    if (!this.instance) {
      this.instance = new Singleton(params)
    }
    return this.instance
  }
  // other methods...
}

Nach dem Login kopieren
Nach dem Login kopieren
  • Die Klasse sollte eine statische Eigenschaft zum Speichern der eindeutig gemeinsam nutzbaren Instanz definieren.

Das Schlüsselwort static bedeutet, dass das Instanzobjekt nicht mit den Instanzen der Klasse, sondern mit der Klassendefinition selbst verknüpft ist.

  • Der Konstruktor der Klasse sollte als privat markiert werden. Die einzige Möglichkeit, eine Instanz unserer Klasse abzurufen, besteht darin, die statische Methode getInstance aufzurufen.
const instance = Singleton.getInstance({ authorName: "Sidali Assoul" })


// let's imagine
const instance1 = Singleton.getInstance({ authorName: "Sidali Assoul" }) // "Sidali Assoul"
const instance2 = Singleton.getInstance({ authorName: "John Doe" }) // "Sidali Assoul"

Nach dem Login kopieren
Nach dem Login kopieren

Wir können die obige Klasse nutzen, indem wir die statische Methode getInstance aufrufen, die der Singleton-Klasse zugeordnet ist.

Die getInstance-Methode garantiert uns, dass wir immer dieselbe Instanz erhalten, auch wenn wir unsere Klasse mehrmals an verschiedenen Stellen unserer Codebasis instanziiert haben.

Singleton Design Pattern: Managing Global States in Your Applications

Also teilen sich beide Variablen (Instanz1 und Instanz2) dieselbe Singleton-Instanz.

Erstes praktisches Szenario

Prisma ist ein bekanntes ORM im JavaScript-Ökosystem. Um Prisma in Ihrer Anwendung zu verwenden, müssen Sie einen PrismaClient importieren und dann ein Objekt daraus instanziieren.

class Singleton {
  private static instance: Singleton
  // other properties...
  public authorName: string

  private constructor({ authorName }: { authorName: string }) {
    this.authorName = authorName
  }

  public static getInstance(params) {
    if (!this.instance) {
      this.instance = new Singleton(params)
    }
    return this.instance
  }
  // other methods...
}

Nach dem Login kopieren
Nach dem Login kopieren

Der Prisma-Client stellt eine verzögerte Verbindung zur Datenbank her, oder anders ausgedrückt, nur dann, wenn Sie zum ersten Mal versuchen, eine Entität abzufragen oder zu mutieren.

const instance = Singleton.getInstance({ authorName: "Sidali Assoul" })


// let's imagine
const instance1 = Singleton.getInstance({ authorName: "Sidali Assoul" }) // "Sidali Assoul"
const instance2 = Singleton.getInstance({ authorName: "John Doe" }) // "Sidali Assoul"

Nach dem Login kopieren
Nach dem Login kopieren

Jedes Mal, wenn der PrismaClient in eine Datei importiert wird, wird eine neue Instanz aus dem PrismaClient erstellt. Daher werden jedes Mal, wenn wir diese Instanzen verwenden, viele Datenbankverbindungen hergestellt.

import { PrismaClient } from "@prisma/client"

export const prismaClient = new PrismaClient()

Nach dem Login kopieren

Viele offene Datenbankverbindungen beeinträchtigen die Leistung Ihrer Anwendung und können sogar zum Herunterfahren der Datenbank führen, da Datenbanken normalerweise nur eine begrenzte Anzahl von Verbindungen verarbeiten können.

Das Singleton-Entwurfsmuster kann uns dabei helfen, ein solches Problem zu verhindern, indem es mehr als eine Instanz der PrismaClient-Klasse vermeidet und einen einzigen Zugriffspunkt über die statische Methode PrismaClientSingleton.getInstance() bereitstellt.

import { prismaClient } from "@/db"

const users = await prismaClient.user.findMany() // query on the users table

Nach dem Login kopieren

Zweites praktisches Szenario

Ein weiteres praktisches Szenario, das wir durchgehen werden, ist ein In-Memory-Ratenbegrenzerdienst.

Benutzer oder Hacker können einen bestimmten Endpunkt spammen, indem sie eine Menge Anfragen an ihn stellen. Dies kann zu Schwachstellen, unerwarteten Kosten oder Serverausfällen führen.

Um dies zu verhindern, können wir einen grundlegenden In-Memory-Ratenbegrenzerdienst implementieren.

Der Dienst sollte die Anzahl der Anfragen pro IP-Adresse für ein bestimmtes Zeitfensterintervall (z. B. 60 Sekunden) begrenzen.

export const prismaClient = new PrismaClient() // a new instance is created every time it gets imported then used.

Nach dem Login kopieren

Die RateLimiterService-Klasse speichert eine Karte, die die Anzahl der Anfragen (requests[ip].count) verfolgt, die von einem bestimmten Benutzer gestellt werden, der durch eine IP-Adresse (den Kartenschlüssel) in einem bestimmten Zeitfenster identifiziert wird (requests[ip].lastRequestTime).

Unser RateLimiterService soll global verwendet werden, oder anders ausgedrückt: Wir möchten nicht jedes Mal, wenn der RateLimiterService importiert wird, die internen Statuswerte zurücksetzen, die aus den Anforderungskarten-, Limit- und Fenstervariablen bestehen.

Abschluss

Das Singleton Design Pattern ist ein leistungsstarkes Tool zur effektiven Verwaltung gemeinsam genutzter Ressourcen in unseren Anwendungen

Wichtige Erkenntnisse:

  1. Singleton stellt sicher, dass eine Klasse nur eine Instanz hat und bietet einen globalen Zugriffspunkt darauf.
  2. Es ist nützlich für die Verwaltung gemeinsam genutzter Ressourcen wie Datenbankverbindungen, Konfigurationseinstellungen oder Caches.
  3. Praktische Anwendungen umfassen die Optimierung von Datenbankverbindungen mit ORMs wie Prisma und die Implementierung von Ratenbegrenzungsdiensten.

Kontakt

Wenn Sie Fragen haben oder etwas weiter besprechen möchten, können Sie mich gerne hier kontaktieren.

Viel Spaß beim Codieren!

Das obige ist der detaillierte Inhalt vonSingleton-Entwurfsmuster: Globale Zustände in Ihren Anwendungen verwalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage