Apa cara terbaik dan paling nyaman untuk menerapkan pola Singleton untuk kelas di TypeScript? (Baik dengan dan tanpa inisialisasi malas).
singleton
typescript
maja
sumber
sumber
export default new Singleton()
?Sejak TS 2.0, kami memiliki kemampuan untuk mendefinisikan pengubah visibilitas pada konstruktor , jadi sekarang kita dapat melakukan lajang dalam TypeScript sama seperti kita terbiasa dari bahasa lain.
Contoh yang diberikan:
Terima kasih @Drenai telah menunjukkan bahwa jika Anda menulis kode menggunakan javascript mentah yang dikompilasi, Anda tidak akan memiliki perlindungan terhadap banyak instantiasi, karena kendala TS menghilang dan konstruktor tidak akan disembunyikan.
sumber
Cara terbaik yang saya temukan adalah:
Inilah cara Anda menggunakannya:
https://codebelt.github.io/blog/typescript/typescript-singleton-pattern/
sumber
Pendekatan berikut menciptakan kelas Singleton yang dapat digunakan dengan tepat seperti kelas konvensional:
Setiap
new Singleton()
operasi akan mengembalikan instance yang sama. Namun ini bisa tidak terduga oleh pengguna.Contoh berikut lebih transparan bagi pengguna tetapi membutuhkan penggunaan yang berbeda:
Pemakaian:
var obj = Singleton.getInstance();
sumber
new Class(...)
sintaksis.Saya terkejut tidak melihat pola berikut di sini, yang sebenarnya terlihat sangat sederhana.
Pemakaian
sumber
Shout
kelas baruAnda dapat menggunakan ekspresi kelas untuk ini (pada 1,6 saya percaya).
atau dengan nama jika kelas Anda perlu mengakses tipenya secara internal
Pilihan lain adalah menggunakan kelas lokal di dalam singleton Anda menggunakan beberapa anggota statis
sumber
Tambahkan 6 baris berikut ke kelas mana saja untuk menjadikannya "Singleton".
Contoh uji:
[Sunting]: Gunakan jawaban Alex jika Anda lebih suka mendapatkan instance melalui properti daripada metode.
sumber
new MySingleton()
, katakan 5 kali? apakah kode Anda memesan satu instance?Saya pikir mungkin menggunakan generik menjadi adonan
Cara Penggunaan
Langkah 1
Langkah 2
sumber
Anda juga dapat menggunakan fungsi Object.Freeze () . Sederhana dan mudah:
sumber
if (!this.instance)
konstruktor? Apakah itu hanya tindakan pencegahan tambahan jika Anda membuat beberapa instance sebelum ekspor?Saya telah menemukan versi baru dari hal ini bahwa kompiler Typecript benar-benar oke, dan saya pikir lebih baik karena tidak perlu memanggil
getInstance()
metode secara terus-menerus.Ini memang datang dengan kelemahan yang berbeda. Jika Anda
Singleton
memang memiliki properti apa pun, maka kompiler Scripteks akan melempar kecocokan kecuali Anda menginisialisasi mereka dengan nilai. Itu sebabnya saya menyertakan_express
properti dalam kelas contoh saya karena kecuali Anda menginisialisasi dengan nilai, bahkan jika Anda menetapkannya nanti dalam konstruktor, Typcript akan berpikir itu belum didefinisikan. Ini bisa diperbaiki dengan menonaktifkan mode ketat, tapi saya lebih suka tidak jika memungkinkan. Ada juga kelemahan lain dari metode ini yang harus saya tunjukkan, karena konstruktor benar-benar dipanggil, setiap kali ia melakukan instance lain secara teknis dibuat, tetapi tidak dapat diakses. Secara teori, ini bisa menyebabkan kebocoran memori.sumber
Ini mungkin adalah proses terpanjang untuk membuat singleton dalam naskah, tetapi dalam aplikasi yang lebih besar adalah yang telah bekerja lebih baik untuk saya.
Pertama Anda membutuhkan kelas Singleton di, katakanlah, "./utils/Singleton.ts" :
Sekarang bayangkan Anda membutuhkan Router singleton "./navigation/Router.ts" :
Bagus !, sekarang mulai atau impor di mana pun Anda butuhkan:
Yang menyenangkan tentang melakukan lajang dengan cara ini adalah bahwa Anda masih menggunakan semua keindahan kelas naskah, ini memberi Anda kecerdasan yang bagus, logika tunggal tetap terpisah dan mudah untuk menghapus jika diperlukan.
sumber
Solusi saya untuk itu:
sumber
return Modal._instance
. Dengan cara ini, jika Andanew
kelas itu, Anda mendapatkan objek yang ada, bukan yang baru.Dalam naskah, seseorang tidak harus mengikuti
new instance()
metodologi Singleton. Kelas statis impor, konstruktor-kurang dapat bekerja sama juga.Mempertimbangkan:
Anda dapat mengimpor kelas dan merujuk ke
YourSingleton.doThing()
kelas lain mana pun. Tapi ingat, karena ini adalah kelas statis, ia tidak memiliki konstruktor jadi saya biasanya menggunakanintialise()
metode yang dipanggil dari kelas yang mengimpor Singleton:Jangan lupa bahwa di kelas statis, setiap metode dan variabel juga harus bersifat statis
this
Anda akan menggunakan nama kelas penuhYourSingleton
.sumber
Berikut ini cara lain untuk melakukannya dengan pendekatan javascript yang lebih konvensional menggunakan IFFE :
Lihat demo
sumber
Instance
variabel? Anda hanya dapat menempatkan variabel dan fungsi langsung di bawahApp.Counter
.Pilihan lain adalah menggunakan Simbol dalam modul Anda. Dengan cara ini Anda dapat melindungi kelas Anda, juga jika pengguna akhir API Anda menggunakan Javascript normal:
Pemakaian:
Jika pengguna menggunakan file kompilasi API js Anda, juga akan mendapatkan kesalahan jika ia mencoba untuk instantiate kelas Anda secara manual:
sumber
Bukan singleton murni (inisialisasi mungkin tidak malas), tetapi pola yang sama dengan bantuan
namespace
s.Akses ke objek Singleton:
sumber
Ini adalah cara paling sederhana
sumber
Dengan cara ini kita dapat menerapkan antarmuka, tidak seperti jawaban yang diterima Ryan Cavanaugh.
sumber
Setelah menjelajahi utas ini dan bermain-main dengan semua opsi di atas - Saya memilih Singleton yang dapat dibuat dengan konstruktor yang tepat:
Ini akan membutuhkan pengaturan awal (dalam
main.ts
, atauindex.ts
), yang dapat dengan mudah diimplementasikan olehnew Singleton(/* PARAMS */)
Lalu, di mana pun dalam kode Anda, panggil saja
Singleton.instnace
; dalam hal ini, untukwork
diselesaikan, saya akan meneleponSingleton.instance.work()
sumber