Cara Membuat Singleton di C++

Cara Membuat Singleton Di C



Dalam C++, singleton adalah prinsip desain yang memastikan kehadiran satu instance kelas di seluruh program dan menyediakan jalur akses global ke instance tersebut.

Pola singleton biasanya digunakan ketika Anda perlu memiliki satu sumber daya bersama yang harus diakses secara global seperti koneksi database, logger, atau manajer konfigurasi. Dengan menerapkan satu instance, hal ini memungkinkan beberapa bagian program mengakses dan memodifikasi objek yang sama, meningkatkan konsistensi data dan mengurangi kebutuhan akan variabel global. Singleton dapat digunakan sebagai cache objek tempat objek yang sering digunakan atau mahal untuk dibuat disimpan dan digunakan kembali di seluruh aplikasi. Pendekatan ini membantu meningkatkan kinerja dengan menghindari pembuatan dan inisialisasi objek yang berlebihan.

Pada artikel ini, kami akan menjelaskan pembuatan singleton dan mendemonstrasikan contoh penataan gaya singleton dalam program C++.







Contoh 1: Membuat Singleton Sederhana dengan Inisialisasi Eager

Singleton sederhana dengan inisialisasi awal adalah pola desain yang memastikan bahwa hanya satu instance kelas yang dibuat, dan dibuat dengan penuh semangat selama inisialisasi statis.



Kami akan mendemonstrasikan cuplikan kode dasar untuk pembuatan singleton sederhana dengan inisialisasi yang bersemangat. Mari kita mulai dengan programnya:



#termasuk

kelas Singleton {
pribadi :
statis Lajang * contoh ;
Lajang ( ) { }
publik :
statis Lajang * dapatkanInstance ( ) {
kembali contoh ;
}
} ;


Lajang * Lajang :: contoh = Singleton baru ( ) ;

ke dalam utama ( ) {

Lajang * singletonInstance1 = Lajang :: dapatkanInstance ( ) ;

Lajang * singletonInstance2 = Lajang :: dapatkanInstance ( ) ;

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

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

kembali 0 ;

}

Kode ini menyertakan header yang menyediakan fungsionalitas untuk bekerja dengan aliran input dan output seperti “std::cout”.





Setelah menyertakan file header, kami mendefinisikan kelas “Singleton” yang mewakili implementasi pola singleton. Ia memiliki konstruktor pribadi dan variabel anggota statis pribadi bernama 'instance'.

Kemudian, fungsi getInstance() diimplementasikan sebagai fungsi anggota statis publik dari kelas “Singleton”. Ia mengembalikan instance singleton yang disimpan dalam instance variabel anggota statis. Contoh variabel anggota statis didefinisikan dan diinisialisasi di luar kelas dengan “Singleton* Singleton::instance = new Singleton();”. Baris ini menginisialisasi instance kelas 'Singleton' dengan penuh semangat selama inisialisasi statis.



Dalam fungsi main(), kita mendeklarasikan dua pointer, “singletonInstance1” dan “singletonInstance2”, dan menetapkan nilai yang dikembalikan dengan memanggil Singleton::getInstance(). Karena instance tersebut diinisialisasi dengan penuh semangat, kedua pointer menunjuk ke instance yang sama. Pernyataan “std::cout” mencetak alamat memori “singletonInstance1” dan “singletonInstance2” ke konsol menggunakan operator “<<” dan “std::endl”.

Kode diakhiri dengan “return 0” yang menunjukkan eksekusi program berhasil.

Saat Anda menjalankan kode ini, hasilnya seperti ini:

Outputnya menampilkan alamat memori “singletonInstance1” dan “singletonInstance2”. Karena kedua pointer ditugaskan dengan instance yang sama yang diperoleh dari Singleton::getInstance(), keduanya memiliki alamat memori yang sama. Hal ini menunjukkan bagaimana pola singleton menjamin bahwa ada satu instance dari kelas tersebut dan panggilan selanjutnya ke getInstance() selalu menghasilkan instance yang sama.

Contoh 2: Implementasi Pola Singleton dengan Inisialisasi Malas

Demonstrasi ini menjelaskan implementasi pola tunggal dengan inisialisasi lambat dan menunjukkan penggunaannya dalam fungsi main(). Penjelasan langkah demi langkah cuplikan kode diberikan setelah program ini:

#termasuk

kelas Singleton {

pribadi :

statis Lajang * contoh ;

Lajang ( ) {

std :: cout << 'Contoh tunggal telah dibuat.' << std :: akhir ;

}

publik :

statis Lajang * dapatkanInstance ( ) {

jika ( contoh == nullptr ) {

contoh = Singleton baru ( ) ;

}

kembali contoh ;

}

ruang kosong tunjukkan pesan ( ) {

std :: cout << 'Halo dari Singleton!' << std :: akhir ;

}

~Lajang ( ) {

std :: cout << 'Contoh tunggal dihancurkan.' << std :: akhir ;

}

} ;

Lajang * Lajang :: contoh = nullptr ;

ke dalam utama ( ) {

Lajang * singletonInstance1 = Lajang :: dapatkanInstance ( ) ;

singletonInstance1 -> tunjukkan pesan ( ) ;

Lajang * singletonInstance2 = Lajang :: dapatkanInstance ( ) ;

singletonInstance2 -> tunjukkan pesan ( ) ;

kembali 0 ;

}

Program dimulai dengan menambahkan file header untuk menjalankan tugas input/output. Kemudian, kami mendeklarasikan dan mendefinisikan kelas “Singleton”. Satu-satunya instance dari kelas tersebut disimpan dalam variabel anggota statis privat bernama “instance”.

Setiap kali konstruktor kelas “Singleton” dipanggil, ia menghasilkan sebuah instance dari kelas “Singleton”. Ini menampilkan pesan “Instans tunggal dibuat” ke konsol menggunakan “std::cout << … << std::endl;”. Konstruktor tidak memiliki parameter apa pun karena merupakan konstruktor default. Ini didefinisikan sebagai Singleton() tanpa argumen apa pun. Kami mendeklarasikannya sebagai private yang artinya hanya dapat dipanggil dari dalam kelas. Hal ini mencegah instantiasi langsung dari kelas “Singleton” dan memastikan bahwa satu-satunya cara untuk mendapatkan sebuah instance adalah melalui fungsi getInstance().

Metode getInstance() kelas “Singleton” dideklarasikan sebagai fungsi anggota statis publik. Ini berperan dalam membangun dan memberikan aksesibilitas ke instance tunggal. Di dalam getInstance(), ia memeriksa apakah instance-nya adalah “nullptr”. Jika ya, menandakan bahwa instance tersebut belum ada, ia menggunakan konstruktor privat untuk membuat instance objek baru dari kelas “Singleton”.

Fungsi showMessage() adalah fungsi anggota sederhana yang menampilkan pesan “Halo dari Singleton!” pesan. Destruktor singleton didefinisikan. Ini disebut secara implisit ketika program menghentikan dan mencetak “Singleton instance dimusnahkan.” pesan yang menunjukkan bahwa instance tunggal dihancurkan. Contoh variabel anggota statis awalnya didefinisikan sebagai 'nullptr'.

Int main() memulai definisi fungsi main(). Kemudian, “Singleton* singletonInstance1 = Singleton::getInstance();” memanggil fungsi getInstance() dari kelas “Singleton” untuk mendapatkan pointer ke instance singleton. Ini menugaskan penunjuk ini ke variabel “singletonInstance1”.

Setelah itu, “singletonInstance1->showMessage();” menggunakan operator panah (->) untuk memanggil fungsi showMessage() pada penunjuk “singletonInstance1”. Fungsi ini menampilkan pesan yang ditentukan di dalamnya ke konsol. Setelah itu, “Singleton* singletonInstance2 = Singleton::getInstance();” memanggil fungsi getInstance() lagi, mendapatkan pointer lain ke instance tunggal. Kali ini, ia menetapkan penunjuk ke variabel “singletonInstance2”. “singletonInstance2->showMessage();” memanggil fungsi showMessage() pada penunjuk “singletonInstance2”. Fungsi ini menampilkan pesan “Halo dari Singleton!” pesan lagi ke konsol.

Terakhir, “kembalikan 0;” menandakan akhir dari fungsi main(), dan program mengembalikan nilai 0 yang menandakan eksekusi program berhasil.

Berikut adalah keluaran cuplikan kode yang telah dijelaskan sebelumnya:

Hasil ini menegaskan bahwa kelas “Singleton” menjamin pembuatan hanya satu instance dan panggilan selanjutnya ke fungsi getInstance() secara andal menghasilkan instance yang sama.

Kesimpulan

Membuat singleton di C++ adalah konsep yang sangat berguna. Dalam posting ini, kami awalnya membahas bagian pengenalan singleton. Selanjutnya, dua contoh dihasilkan untuk mengimplementasikan singleton di C++. Ilustrasi pertama menunjukkan implementasi inisialisasi singleton yang bersemangat. Sedangkan implementasi inisialisasi malas dari pola tunggal diberikan pada contoh kedua artikel ini. Selain itu, cuplikan dari keluaran yang dihasilkan juga ditampilkan untuk program terkait.