Cara Membuat Singleton dalam C++

Cara Membuat Singleton Dalam C



Dalam C++, singleton ialah prinsip reka bentuk yang memastikan kehadiran contoh tunggal kelas sepanjang program dan menyediakan titik capaian global kepada contoh tertentu itu.

Corak singleton biasanya digunakan apabila anda perlu mempunyai satu sumber dikongsi yang harus diakses secara global seperti sambungan pangkalan data, pembalak atau pengurus konfigurasi. Dengan menguatkuasakan satu contoh, ia membenarkan berbilang bahagian program untuk mengakses dan mengubah suai objek yang sama, menggalakkan ketekalan data dan mengurangkan keperluan untuk pembolehubah global. Singleton boleh digunakan sebagai cache objek di mana objek yang kerap digunakan atau mahal untuk dibuat disimpan dan digunakan semula sepanjang aplikasi. Pendekatan ini membantu meningkatkan prestasi dengan mengelakkan penciptaan objek berlebihan dan permulaan.

Dalam artikel ini, kami akan menerangkan penciptaan singleton dan menunjukkan contoh penggayaan singleton dalam program C++.







Contoh 1: Mencipta Singleton Mudah dengan Permulaan Bersemangat

Singleton mudah dengan pemulaan awal ialah corak reka bentuk yang memastikan bahawa hanya satu contoh kelas dicipta dan ia dibuat dengan penuh semangat semasa pemulaan statik.



Kami akan menunjukkan coretan kod asas untuk penciptaan singleton mudah dengan permulaan yang bersemangat. Mari mulakan dengan program:



#include

kelas Singleton {
persendirian :
statik Singleton * contoh ;
Singleton ( ) { }
awam :
statik Singleton * getInstance ( ) {
kembali contoh ;
}
} ;


Singleton * Singleton :: contoh = Singleton baharu ( ) ;

int utama ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

std :: cout << 'singletonletonInstance1: ' << singletonInstance1 << std :: endl ;

std :: cout << 'singletonletonInstance2: ' << singletonInstance2 << std :: endl ;

kembali 0 ;

}

Kod tersebut termasuk pengepala yang menyediakan kefungsian untuk berfungsi dengan aliran input dan output seperti 'std::cout'.





Selepas memasukkan fail pengepala, kami mentakrifkan kelas 'Singleton' yang mewakili pelaksanaan corak tunggal. Ia mempunyai pembina peribadi dan pembolehubah ahli statik peribadi bernama 'contoh'.

Kemudian, fungsi getInstance() dilaksanakan sebagai fungsi ahli statik awam bagi kelas 'Singleton'. Ia mengembalikan contoh tunggal yang disimpan dalam contoh pembolehubah ahli statik. Contoh pembolehubah ahli statik ditakrifkan dan dimulakan di luar kelas dengan 'Singleton* Singleton::instance = new Singleton();'. Baris ini memulakan instance kelas 'Singleton' dengan penuh semangat semasa pemulaan statik.



Dalam fungsi main(), kami mengisytiharkan dua penunjuk, 'singletonInstance1' dan 'singletonInstance2', dan menetapkan nilai yang dikembalikan dengan memanggil Singleton::getInstance(). Memandangkan contoh itu dimulakan dengan penuh semangat, kedua-dua penunjuk menunjuk kepada contoh yang sama. Penyataan “std::cout” mencetak alamat memori “singletonInstance1” dan “singletonInstance2” ke konsol menggunakan operator “<<” dan “std::endl”.

Kod berakhir dengan 'return 0' yang menunjukkan pelaksanaan program yang berjaya.

Apabila anda menjalankan kod ini, outputnya adalah seperti ini:

Output memaparkan alamat memori 'singletonInstance1' dan 'singletonInstance2'. Oleh kerana kedua-dua penunjuk diberikan dengan contoh yang sama yang diperoleh daripada Singleton::getInstance(), ia mempunyai alamat memori yang sama. Ini menunjukkan bagaimana corak tunggal menjamin bahawa terdapat satu contoh kelas dan bahawa panggilan masa depan untuk getInstance() sentiasa menghasilkan contoh yang sama.

Contoh 2: Pelaksanaan Corak Singleton dengan Permulaan Lazy

Demonstrasi ini menerangkan pelaksanaan corak tunggal dengan permulaan malas dan menunjukkan penggunaannya dalam fungsi main(). Penjelasan langkah demi langkah bagi coretan kod disediakan selepas program ini:

#include

kelas Singleton {

persendirian :

statik Singleton * contoh ;

Singleton ( ) {

std :: cout << 'Tokoh tunggal dibuat.' << std :: endl ;

}

awam :

statik Singleton * getInstance ( ) {

jika ( contoh == nullptr ) {

contoh = Singleton baharu ( ) ;

}

kembali contoh ;

}

batal showMessage ( ) {

std :: cout << 'Hello dari Singleton!' << std :: endl ;

}

~Bujang ( ) {

std :: cout << 'Instance singleton musnah.' << std :: endl ;

}

} ;

Singleton * Singleton :: contoh = nullptr ;

int utama ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

singletonInstance1 -> showMessage ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

singletonInstance2 -> showMessage ( ) ;

kembali 0 ;

}

Program ini bermula dengan menambah fail pengepala untuk menjalankan tugas input/output. Kemudian, kami mengisytiharkan dan mentakrifkan kelas 'Singleton'. Satu-satunya contoh kelas disimpan dalam pembolehubah ahli statik peribadi bernama 'contoh'.

Apabila pembina kelas 'Singleton' dipanggil, ia menjana contoh kelas 'Singleton'. Ia mengeluarkan mesej 'Singleton instance created' ke konsol menggunakan 'std::cout << ... << std::endl;'. Pembina tidak mempunyai sebarang parameter kerana ia adalah pembina lalai. Ia ditakrifkan sebagai Singleton() tanpa sebarang hujah. Kami mengisytiharkannya sebagai peribadi yang bermaksud bahawa ia hanya boleh digunakan dari dalam kelas. Ini menghalang instantiasi langsung kelas 'Singleton' dan memastikan bahawa satu-satunya cara untuk mendapatkan contoh adalah melalui fungsi getInstance().

Kaedah getInstance() kelas 'Singleton' diisytiharkan sebagai fungsi ahli statik awam. Ia berperanan untuk mewujudkan dan memberikan kebolehaksesan kepada contoh tunggal. Di dalam getInstance(), ia menyemak sama ada contoh itu adalah 'nullptr'. Jika ya, menandakan bahawa contoh itu belum ada, ia menggunakan pembina persendirian untuk membuat instantiat objek baharu kelas 'Singleton'.

Fungsi showMessage() ialah fungsi ahli ringkas yang memaparkan 'Hello from Singleton!' mesej. Pemusnah singleton ditakrifkan. Ia dipanggil secara tersirat apabila program menamatkan dan mencetak 'Instance Singleton dimusnahkan.' mesej yang menunjukkan bahawa contoh tunggal dimusnahkan. Contoh pembolehubah ahli statik pada mulanya ditakrifkan sebagai 'nullptr'.

Int main() memulakan definisi fungsi main(). Kemudian, 'Singleton* singletonInstance1 = Singleton::getInstance();' memanggil fungsi getInstance() kelas 'Singleton' untuk mendapatkan penunjuk kepada contoh tunggal. Ia memberikan penuding ini kepada pembolehubah 'singletonInstance1'.

Selepas itu, 'singletonInstance1->showMessage();' menggunakan operator anak panah (->) untuk memanggil fungsi showMessage() pada penunjuk 'singletonInstance1'. Fungsi ini memaparkan mesej yang dinyatakan di dalamnya kepada konsol. Selepas itu, 'Singleton* singletonInstance2 = Singleton::getInstance();' memanggil fungsi getInstance() sekali lagi, mendapatkan penunjuk lain kepada contoh tunggal. Kali ini, ia memberikan penuding kepada pembolehubah 'singletonInstance2'. 'singletonInstance2->showMessage();' memanggil fungsi showMessage() pada penunjuk 'singletonInstance2'. Fungsi ini memaparkan 'Hello dari Singleton!' mesej sekali lagi kepada konsol.

Akhir sekali, 'kembali 0;' menandakan berakhirnya fungsi main(), dan program mengembalikan nilai 0 yang menandakan pelaksanaan program yang berjaya.

Berikut ialah output coretan kod yang dijelaskan sebelum ini:

Keputusan ini mengesahkan bahawa kelas 'Singleton' memastikan penciptaan hanya satu contoh dan panggilan selanjutnya ke fungsi getInstance() pasti menghasilkan contoh yang sama.

Kesimpulan

Mencipta singleton dalam C++ adalah konsep yang sangat berguna. Dalam siaran ini, kami pada mulanya membincangkan bahagian pengenalan singleton. Tambahan pula, dua contoh dihasilkan untuk melaksanakan singleton dalam C++. Ilustrasi pertama menunjukkan pelaksanaan pemulaan tunggal yang bersemangat. Manakala pelaksanaan permulaan malas corak tunggal disediakan dalam contoh kedua artikel ini. Selain itu, syot kilat keluaran yang dihasilkan juga dipaparkan untuk program yang sepadan.