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.
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:
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.
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... }
Kata kunci statik bermaksud objek contoh tidak dikaitkan dengan tika kelas tetapi dengan definisi kelas itu sendiri.
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"
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.
Jadi kedua-dua pembolehubah (contoh1 dan contoh2) berkongsi tika tunggal yang sama.
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... }
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"
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()
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
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.
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.
Corak Reka Bentuk Tunggal ialah alat yang berkuasa untuk menguruskan sumber kongsi dengan berkesan dalam aplikasi kami
Pengambilan utama:
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!