Rumah > hujung hadapan web > tutorial js > Corak Reka Bentuk Singleton: Mengurus Negeri Global dalam Aplikasi Anda

Corak Reka Bentuk Singleton: Mengurus Negeri Global dalam Aplikasi Anda

Susan Sarandon
Lepaskan: 2024-12-03 19:34:15
asal
416 orang telah melayarinya

Pernahkah anda mendapati diri anda berurusan dengan objek yang perlu dikongsi di beberapa bahagian aplikasi anda—mungkin sambungan pangkalan data, klien WebSocket atau pengurus konfigurasi?

Bagaimanakah anda mengurus objek sedemikian supaya ia kekal konsisten dan boleh diakses sepanjang aplikasi atau proses kitaran hayat? Di sinilah Corak Reka Bentuk Tunggal dimainkan.

Gambaran keseluruhan

Singleton ialah corak reka bentuk ciptaan , iaitu kategori corak reka bentuk yang menangani masalah berbeza yang datang dengan cara asli mencipta objek dengan baharu kata kunci atau operator.

Corak Reka Bentuk Tunggal menumpukan pada menyelesaikan dua masalah utama:

  1. Bagaimanakah kami boleh menyediakan titik akses global kepada contoh kami?
  2. Bagaimanakah kita boleh memastikan bahawa kelas atau jenis objek tertentu hanya mempunyai satu tika?

Ia boleh memudahkan dan menyeragamkan cara kami mengurus jenis atau jenis keadaan global tertentu seperti sambungan pangkalan data, klien WebSocket, perkhidmatan caching atau apa sahaja yang kami perlukan untuk berterusan dan bermutasi dalam ingatan semasa keseluruhan kitaran hayat aplikasi.

Bagaimanakah kita boleh melaksanakan Corak Reka Bentuk Singleton?

Singleton Design Pattern: Managing Global States in Your Applications

Skema di atas diterjemahkan ke dalam kelas TypeScript ini:

Contoh TypeScript

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...
}

Salin selepas log masuk
Salin selepas log masuk
  • Kelas harus menentukan sifat statik untuk menyimpan tika yang boleh dikongsi secara unik.

Kata kunci statik bermaksud objek contoh tidak dikaitkan dengan tika kelas tetapi dengan definisi kelas itu sendiri.

  • Pembina kelas hendaklah ditandakan sebagai peribadi. Satu-satunya cara untuk mendapatkan contoh kelas kami ialah dengan memanggil kaedah statik getInstance.
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"

Salin selepas log masuk
Salin selepas log masuk

Kita boleh menggunakan kelas di atas dengan memanggil kaedah statik getInstance yang dikaitkan dengan kelas Singleton.

Kaedah getInstance menjamin kami bahawa kami sentiasa mendapat tika yang sama walaupun kami membuat instance kelas kami beberapa kali di lokasi berbeza pangkalan kod kami.

Singleton Design Pattern: Managing Global States in Your Applications

Jadi kedua-dua pembolehubah (contoh1 dan contoh2) berkongsi tika tunggal yang sama.

Senario Praktikal Pertama

Prisma ialah ORM yang terkenal dalam ekosistem JavaScript. Untuk menggunakan Prisma dalam aplikasi anda, anda perlu mengimport PrismaClient kemudian membuat instantiate objek daripadanya.

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...
}

Salin selepas log masuk
Salin selepas log masuk

Klien Prisma menyambung ke pangkalan data dengan cara yang malas, atau dalam istilah lain, hanya apabila anda mula-mula cuba bertanya atau memutasi sesuatu entiti.

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"

Salin selepas log masuk
Salin selepas log masuk

Setiap kali prismaClient diimport dalam fail, tika baharu akan dibuat daripada PrismaClient. Oleh itu, banyak sambungan pangkalan data akan diwujudkan setiap kali kami menggunakan kejadian tersebut.

import { PrismaClient } from "@prisma/client"

export const prismaClient = new PrismaClient()

Salin selepas log masuk

Banyak sambungan pangkalan data terbuka akan merendahkan prestasi aplikasi anda dan mungkin menyebabkan penutupan pangkalan data kerana pangkalan data biasanya hanya boleh mengendalikan bilangan sambungan yang terhad.

Corak Reka Bentuk Singleton boleh membantu kami mencegah isu sedemikian dengan mengelak daripada mempunyai lebih daripada satu tika kelas PrismaClient dan dengan menyediakan satu titik untuk mengaksesnya melalui kaedah statik PrismaClientSingleton.getInstance().

import { prismaClient } from "@/db"

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

Salin selepas log masuk

Senario Praktikal Kedua

Satu lagi senario praktikal yang akan kami lalui ialah perkhidmatan pengehad kadar dalam ingatan.

Pengguna atau penggodam boleh menghantar spam pada titik akhir tertentu dengan membuat banyak permintaan kepadanya. Ini boleh membawa kepada kelemahan, kos yang tidak dijangka atau kegagalan pelayan.

Untuk mengelakkannya, kami boleh melaksanakan perkhidmatan pengehad kadar dalam memori asas.

Perkhidmatan harus mengehadkan bilangan permintaan setiap alamat IP untuk selang tetingkap pemasaan tertentu (60 saat, contohnya).

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

Salin selepas log masuk

Kelas RateLimiterService menyimpan peta yang menjejaki bilangan permintaan (permintaan[ip].count) yang dibuat oleh pengguna tertentu yang dikenal pasti oleh alamat IP (kunci peta) dalam tetingkap masa tertentu (permintaan[ip].LastRequestTime).

RateLimiterService kami bertujuan untuk digunakan secara global, atau dalam istilah lain, kami tidak mahu menetapkan semula nilai keadaan dalaman yang terdiri daripada peta permintaan, had dan pembolehubah tetingkap setiap kali RateLimiterService diimport.

Kesimpulan

Corak Reka Bentuk Tunggal ialah alat yang berkuasa untuk menguruskan sumber kongsi dengan berkesan dalam aplikasi kami

Pengambilan utama:

  1. Singleton memastikan kelas hanya mempunyai satu tika dan menyediakan titik global akses kepadanya.
  2. Ia berguna untuk mengurus sumber kongsi seperti sambungan pangkalan data, tetapan konfigurasi atau cache.
  3. Aplikasi praktikal termasuk mengoptimumkan sambungan pangkalan data dengan ORM seperti Prisma dan melaksanakan perkhidmatan mengehadkan kadar.

Kenalan

Jika anda mempunyai sebarang pertanyaan atau ingin membincangkan sesuatu dengan lebih lanjut, sila hubungi saya di sini.

Selamat pengekodan!

Atas ialah kandungan terperinci Corak Reka Bentuk Singleton: Mengurus Negeri Global dalam Aplikasi Anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan