Daftar Isi:

Bagaimana Melakukan Pola Desain Singleton di C++: 9 Langkah
Bagaimana Melakukan Pola Desain Singleton di C++: 9 Langkah

Video: Bagaimana Melakukan Pola Desain Singleton di C++: 9 Langkah

Video: Bagaimana Melakukan Pola Desain Singleton di C++: 9 Langkah
Video: Thread Safety In Singleton Design Pattern In C++ 2024, November
Anonim
Bagaimana Melakukan Pola Desain Singleton di C++
Bagaimana Melakukan Pola Desain Singleton di C++

Pengantar:

Tujuan dari panduan instruksi ini adalah untuk mengajari pengguna tentang cara menerapkan pola desain tunggal dalam program C++ mereka. Dengan demikian, set instruksi ini juga akan menjelaskan kepada pembaca mengapa elemen-elemen dari sebuah singleton seperti itu dan bagaimana kode diproses. Mengetahui hal ini, akan membantu di masa depan dengan men-debug lajang masa depan Anda. Apa pola desain tunggal? Pola desain tunggal adalah pola desain di mana pembuat kode membuat kelas yang hanya dapat digunakan sekali, fungsi publik kelas pada dasarnya dapat diakses di mana saja, asalkan Anda #menyertakan file header di file terkait proyek lainnya.

Pola desain tunggal adalah pola desain yang harus diketahui untuk setiap pemrogram berorientasi objek, pemrogram perangkat lunak, dan pemrogram game. Pola desain tunggal juga merupakan salah satu pola desain pengkodean termudah di luar sana. Mempelajarinya dapat membantu Anda mempelajari pola desain lain yang lebih sulit di masa mendatang. Ini juga dapat membantu Anda merampingkan kode program Anda dengan cara yang menurut Anda tidak mungkin.

Sementara kesulitan dari pola desain singleton mudah jika dibandingkan dengan pola desain lainnya, set instruksi ini memiliki tingkat kesulitan sedang. Ini berarti bahwa untuk melakukan instruksi ini, kami menyarankan Anda mengetahui persyaratan sintaks dasar dan lanjutan dari C++. Anda juga harus mengetahui etiket pengkodean C++ yang tepat (mis. Jaga variabel kelas tetap pribadi, satu kelas per file header, dll.). Anda juga harus tahu cara mengosongkan memori dan cara kerja konstruktor dan destruktor di C++.

Panduan instruksional ini akan memakan waktu rata-rata sekitar 10-15 menit.

Persyaratan Bahan:

-Komputer (bisa PC atau Mac) yang bisa menjalankan Visual Studios (versi apapun)

-Program sederhana, dibuat di Visual Studios, yang dapat Anda uji dengan singleton Anda

Catatan: Pola desain tunggal dapat dilakukan pada antarmuka pengkodean atau IDE pendukung C++ lainnya, tetapi untuk set instruksi ini, kita akan menggunakan Visual Studios Enterprise Edition.

Langkah 1: Buat Kelas Anda, Dengan File Header dan File CPP

Buat Kelas Anda, Dengan File Header dan File CPP
Buat Kelas Anda, Dengan File Header dan File CPP
Buat Kelas Anda, Dengan File Header dan File CPP
Buat Kelas Anda, Dengan File Header dan File CPP

Untuk membuat dua file ini dan kelas sekaligus, buka proyek / program Anda di Visual Studios, buka penjelajah solusi, klik kanan, dan sebuah kotak akan muncul di dekat kursor mouse Anda, temukan opsi "Tambah", arahkan di atasnya, dan kotak lain akan muncul di sebelah kanan. Di kotak ini, Anda ingin menemukan opsi "Item Baru..", klik dan sebuah jendela, menyerupai gambar foto 1.1 di bawah, akan muncul. Di jendela ini Anda ingin memilih "C++ Class" dan kemudian tekan "Add". Ini akan membuka jendela lain yang menyerupai gambar foto 1.2. Di jendela ini, Anda mengetikkan nama kelas Anda di bidang "Nama Kelas" dan Visual Studios akan secara otomatis memberi nama file yang sebenarnya setelah nama kelas. Untuk tujuan instruksi ini, kita akan menamai kelas kita “EngineDebugSingleton”, tetapi bisa berupa nama berbasis huruf apa saja. Anda sekarang dapat menekan "OK" dan melanjutkan ke langkah 2.

Catatan: Penjelajah solusi dan tempat file disimpan di komputer Anda terpisah. Memindahkan atau membuat apa pun di penjelajah solusi tidak akan memindahkan atau mengatur file di dalam penjelajah file OS Anda. Cara aman untuk mengatur file Anda di sisi file explorer akan dihapus, tetapi tidak menghapus file tertentu dari solusi explorer, pindahkan file yang sama di file explorer ke lokasi yang diinginkan dan kemudian kembali ke solusi explorer, klik kanan, temukan opsi “Tambah”, lalu cari “Item yang Ada” dan temukan file yang Anda pindahkan. Pastikan Anda memindahkan file header dan cpp.

Langkah 2: Setel Konstruktor ke Pribadi

Setel Konstruktor ke Pribadi
Setel Konstruktor ke Pribadi

Dengan file CPP dan file header yang baru Anda buat, jika tidak terbuka secara otomatis saat Anda membuatnya, buka penjelajah solusi dan klik dan buka "EngineDebugSingleton.h". Anda kemudian akan disambut dengan “EngineDebugSingleton()”, konstruktor default kelas dan “~EngineDebugSingleton()” destructor kelas. Untuk langkah ini, kita ingin mengatur konstruktor ke private, ini berarti fungsi ini hanya tersedia untuk kelas dan tidak ada yang lain. Dengan ini, Anda tidak akan dapat membuat variabel atau mengalokasikan kelas ke memori di luar kelas, hanya di file header kelas dan fungsi kelas lainnya. Memiliki konstruktor pribadi adalah kunci untuk pola desain dan bagaimana lajang beroperasi. Kami akan menemukan dalam langkah-langkah mendatang bagaimana singleton dipakai dan diakses.

Kelas sekarang akan terlihat seperti ini setelah memindahkan konstruktor ke pribadi (Lihat foto terkait)

Langkah 3: Atur Destructor ke Private

Atur Destructor ke Private
Atur Destructor ke Private

Seperti yang kami lakukan dengan konstruktor di

langkah 2, untuk langkah ini, sekarang kita akan mengatur destructor menjadi private. Seperti halnya konstruktor, tidak ada apa pun, kecuali kelas itu sendiri, yang dapat menghapus variabel apa pun dari kelas dari memori.

Kelas sekarang akan terlihat seperti ini setelah menyelesaikan langkah ini. (Lihat foto terkait)

Langkah 4: Membuat Variabel Pointer Statis di Singleton

Membuat Variabel Pointer Statis di Singleton
Membuat Variabel Pointer Statis di Singleton

Pada langkah ini, kita akan membuat

variabel pointer statis tipe "EngineDebugSingleton*". Ini akan menjadi variabel yang akan digunakan mengalokasikan singleton kita ke memori dan akan menunjuk ke sana sepanjang waktu singleton kita dialokasikan ke memori.

Seperti inilah tampilan file header kita setelah membuat variabel ini

Langkah 5: Membuat Fungsi Instance

Membuat Fungsi Instance
Membuat Fungsi Instance

Kami sekarang ingin membuat sebuah contoh

fungsi. Fungsi tersebut harus berupa fungsi statis dan ingin mengembalikan referensi ke kelas kita (“EngineDebugSingleton&”). Kami memanggil fungsi kami Instance(). Dalam fungsi itu sendiri, pertama-tama kita ingin menguji apakah ptrInstance == nullptr (dapat disingkat menjadi !ptrInstance), jika nullptr, ini berarti bahwa singleton belum dialokasikan dan dalam lingkup pernyataan if, kita akan ingin mengalokasikan dengan melakukan ptrInstance = new EngineDebugSingleton(). Di sinilah Anda benar-benar mengalokasikan singleton ke memori. Setelah keluar dari cakupan pernyataan if, kita kemudian akan mengembalikan apa yang ditunjuk oleh ptrInstance, yang dilambangkan dengan sintaks “*ptrInstance”. Kami akan banyak menggunakan fungsi ini saat membuat fungsi publik statis kami, jadi kami dapat memeriksa untuk melihat apakah singleton telah dibuat dan dialokasikan ke memori. Intinya, fungsi ini membuat Anda hanya dapat memiliki satu alokasi kelas dan tidak lebih.

Seperti inilah tampilan kelas kita sekarang setelah membuat fungsi Instance(). Seperti yang Anda lihat, semua yang telah kami lakukan tetap berada di bagian privat kelas, ini akan sedikit berubah dalam beberapa langkah berikutnya.

Langkah 6: Membuat Fungsi Publik Statis

Membuat Fungsi Publik Statis
Membuat Fungsi Publik Statis
Membuat Fungsi Publik Statis
Membuat Fungsi Publik Statis
Membuat Fungsi Publik Statis
Membuat Fungsi Publik Statis

Setelah Anda membuat fungsi dari

langkah 5, Anda dapat mulai membuat fungsi publik statis. Setiap fungsi publik harus memiliki fungsi privat untuk mengikutinya, nama fungsi ini tidak boleh sama. Mengapa membuat fungsi Statis? Kami membuat fungsi publik statis sehingga dapat diakses tanpa objek yang sebenarnya. Jadi, alih-alih melakukan sesuatu seperti "EngineDebugSingleObj->SomeFunction()", kami melakukan "EngineDebugSingleton:: Some Function()". Ini memungkinkan singleton untuk diakses pada dasarnya di mana saja dalam kode, asalkan Anda telah #menyertakan file header dalam file proyek tertentu yang sedang Anda kerjakan. Dengan ini, Anda juga dapat membuat singleton melalui salah satu fungsi publiknya.

Untuk tujuan kita dalam langkah ini, kita membuat dua fungsi public static void, “add()” dan “subtract()”. Di bagian pribadi, kami memiliki dua fungsi lagi, "PrivAdd()" dan "PrivSubtract()". Kami juga menambahkan variabel int yang disebut "NumberOfThings". Definisi untuk fungsi-fungsi ini akan masuk ke file CPP kelas kami. Untuk membuat fungsi dengan mudah masuk ke file CPP, Anda menyorot, dengan kursor Anda, fungsi, yang seharusnya memiliki garis hijau di bawahnya, dan tekan "Left ALT + ENTER", itu akan memberi Anda opsi buat definisi di file CPP terkait kelas. Lihat Foto 6.1 untuk melihat seperti apa tampilan file header dan setelah Anda membuat semua definisi fungsi, CPP Anda akan terlihat seperti Foto 6.2 kecuali definisi fungsi Anda tidak memiliki kode di dalamnya.

Anda sekarang ingin menambahkan kode yang sama seperti pada Foto 6.2 ke dalam definisi fungsi Anda. Seperti yang dinyatakan sebelumnya, fungsi publik kita akan menggunakan fungsi Instance(), yang akan mengembalikan apa yang ditunjuk ptrInstance. Ini memungkinkan kita untuk mengakses fungsi privat dari kelas kita. Dengan fungsi publik lajang mana pun, Anda hanya boleh memanggil fungsi Instance itu. Satu-satunya pengecualian untuk ini adalah fungsi Terminate kami.

Catatan: Fungsi publik dan pribadi yang tepat yang ditunjukkan pada langkah ini tidak diperlukan, Anda dapat memiliki nama fungsi dan operasi yang berbeda dalam fungsi pribadi, tetapi untuk semua jenis fungsi publik, Anda harus memiliki fungsi pribadi untuk mengikutinya dan fungsi publik harus selalu menggunakan, dalam kasus kami, fungsi Instance().

Langkah 7: Membuat Fungsi Terminate

Membuat Fungsi Terminasi
Membuat Fungsi Terminasi
Membuat Fungsi Terminasi
Membuat Fungsi Terminasi

Karena kita hanya dapat membatalkan alokasi singleton kita dari memori di kelas kita, kita harus membuat fungsi publik statis. Fungsi ini akan memanggil delete pada ptrInstance, yang memanggil destruktor kelas dan kemudian kita ingin mengatur ptrInstance kembali ke nullptr sehingga dapat dialokasikan kembali jika program Anda tidak berakhir. Anda juga ingin menghentikan Lajang Anda untuk membersihkan memori yang dialokasikan yang Anda alokasikan dalam variabel pribadi Lajang mana pun.

Langkah 8: Mengatur PtrInstance ke Nullptr

Mengatur PtrInstance ke Nullptr
Mengatur PtrInstance ke Nullptr

Untuk menyelesaikan singleton Anda, Anda ingin menuju ke file EngineDebugSingleton. CPP dan di bagian atas file CPP, dalam contoh kami, ketik “EngineDebugSingleton* EngineDebugSingleton::ptrInstance = nullptr.”

Melakukan ini awalnya akan mengatur ptrInstance ke nullptr, jadi ketika Anda pertama kali melalui fungsi instance untuk pertama kalinya, kelas kita akan diizinkan untuk dialokasikan ke memori. Tanpa itu, kemungkinan besar Anda akan mendapatkan kesalahan karena Anda akan mencoba mengakses memori yang tidak memiliki alokasi apa pun untuknya.

Langkah 9: Uji dan Kesimpulan

Tes dan Kesimpulan
Tes dan Kesimpulan

Kami sekarang ingin menguji singleton kami untuk memastikannya berfungsi, ini akan melibatkan kami memanggil fungsi publik seperti yang dijelaskan pada langkah 6 dan kami menyarankan Anda mengatur breakpoint untuk melangkah melalui kode Anda dan melihat bahwa singleton berfungsi sebagai harus. Titik awal kami akan berada di main.cpp proyek kami dan main.cpp kami sekarang terlihat seperti gambar di bawah ini.

Selamat! Anda baru saja menyelesaikan implementasi pertama dari Singleton Design Pattern. Dengan pola desain ini, Anda sekarang dapat merampingkan kode Anda dalam berbagai cara. Misalnya, Anda sekarang dapat membuat sistem pengelola yang beroperasi di seluruh waktu program Anda, yang dapat diakses melalui fungsi statis di mana pun Anda menyertakan kelas.

File header akhir Anda akan terlihat seperti foto 7.1. File CPP terkait singleton Anda akan terlihat seperti Foto 6.2 dengan tambahan, di bagian atas file, kode yang ditunjukkan pada langkah 8. Instruksi ini memberi Anda struktur sederhana dari Singleton Design Pattern.

Saran Pemecahan Masalah:

Mendapatkan kesalahan terkait memori?

Pastikan Anda merujuk ke langkah 7 dan langkah 8 untuk memastikan Anda menyetel ptrInstance ke nullptr.

Loop tak terbatas terjadi?

Pastikan untuk fungsi publik, dalam definisinya, Anda memanggil fungsi privat, bukan fungsi publik yang sama.

Objek yang dialokasikan dalam singleton menyebabkan kebocoran memori?

Pastikan Anda memanggil fungsi penghentian singleton Anda bila sesuai dalam kode program Anda, dan di destruktor singleton Anda, pastikan Anda membatalkan alokasi objek apa pun yang dialokasikan ke memori dalam lingkup kode singleton.