Pola Singleton
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 54 dari 61.
Terkadang kamu memerlukan tepat satu instance object di seluruh programmu: pengelola konfigurasi, sistem pencatatan log, atau koneksi database. Pola Singleton memastikan bahwa hanya ada satu instance dan menyediakan titik akses global ke instance tersebut.
Di C, kita menerapkannya menggunakan variabel static di dalam file sumber. Ingat, static pada cakupan file berarti variabel tersebut hanya dapat diakses dari file itu dan tetap ada selama program berjalan. Jika digabungkan dengan fungsi getter, ini menghasilkan Singleton:
// config.c
#include "config.h"
#include <stdlib.h>
struct Config {
int max_connections;
int timeout;
};
static Config* instance = NULL;
Config* get_config(void) {
if (instance == NULL) {
instance = malloc(sizeof(Config));
instance->max_connections = 100;
instance->timeout = 30;
}
return instance;
}Keajaiban terjadi di get_config(). Pemanggilan pertama membuat dan menginisialisasi instance. Setiap pemanggilan berikutnya mengembalikan pointer yang sama.
Kata kunci static memastikan instance mempertahankan nilainya di antara pemanggilan fungsi dan tetap tersembunyi dari file lain.
Dari header, pengguna hanya melihat fungsi getter. Mereka tidak dapat mengakses atau mengubah variabel statis secara langsung. Tidak peduli berapa kali atau dari mana kamu memanggil get_config(), kamu selalu mendapatkan object yang sama.
Tantangan
MudahMari buat module Settings yang mengelola konfigurasi di seluruh aplikasi menggunakan pola Singleton. Berapa kali pun kodemu meminta pengaturan, kode tersebut harus selalu menerima instance yang sama persis.
Kamu akan menyusun kodemu dalam tiga file:
settings.h: Deklarasikan tipeSettingsyang buram menggunakan deklarasi awal (isi struct tetap tersembunyi). Deklarasikan fungsiget_settingsyang mengembalikan pointer ke instance singleton, serta fungsi getter dan setter untuk dua nilai konfigurasi:volume(bilangan bulat) danbrightness(bilangan bulat). Include guard sangat penting di sini.settings.c: Di sinilah keajaiban terjadi. Definisikan structSettingsyang sebenarnya dengan fieldvolumedanbrightness. Buat variabel pointerstaticuntuk menyimpan satu instance (diinisialisasi denganNULL). Implementasikanget_settingsagar pemanggilan pertama mengalokasikan dan menginisialisasi instance dengan nilai bawaan (volume: 50, brightness: 75), sedangkan pemanggilan berikutnya cukup mengembalikan instance yang sudah ada. Implementasikan getter dan setter untuk mengakses dan mengubah field tersembunyi.main.c: Tunjukkan bahwa Singleton berfungsi dengan benar. Baca dua bilangan bulat yang mewakili nilai volume dan brightness yang baru. Panggilget_settingsdua kali, lalu simpan hasilnya dalam dua variabel pointer yang berbeda. Gunakan pointer pertama untuk memperbarui volume dan brightness dengan nilai input. Kemudian gunakan pointer kedua untuk mengambil dan mencetak kedua nilai tersebut. Jika Singleton berfungsi, perubahan melalui satu pointer akan terlihat melalui pointer lainnya.
Programmu akan menerima dua input:
- Nilai volume yang baru
- Nilai brightness yang baru
Cetak volume dan brightness pada baris terpisah setelah mengubahnya melalui satu pointer dan membacanya melalui pointer lainnya.
Contoh output saat inputnya adalah 80 dan 100:
80
100Contoh output saat inputnya adalah 25 dan 60:
25
60Contoh output saat inputnya adalah 0 dan 50:
0
50Inti utamanya adalah kedua pointer menunjuk ke object yang sama di memori. Itulah esensi pola Singleton. Variabel static di dalam file sumbermu memastikan hanya ada satu instance, dan instance itu tetap ada selama program berjalan.
Coba sendiri
#include <stdio.h>
#include "settings.h"
int main() {
int new_volume, new_brightness;
scanf("%d", &new_volume);
scanf("%d", &new_brightness);
// TODO: Panggil get_settings dua kali dan simpan hasilnya dalam dua variabel pointer yang berbeda
// TODO: Gunakan pointer pertama untuk memperbarui volume dan brightness dengan nilai input
// TODO: Gunakan pointer kedua untuk mengambil dan mencetak volume dan brightness
// (Ini menunjukkan bahwa kedua pointer menunjuk ke instance singleton yang sama)
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online