Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 tipe Settings yang buram menggunakan deklarasi awal (isi struct tetap tersembunyi). Deklarasikan fungsi get_settings yang mengembalikan pointer ke instance singleton, serta fungsi getter dan setter untuk dua nilai konfigurasi: volume (bilangan bulat) dan brightness (bilangan bulat). Include guard sangat penting di sini.
  • settings.c: Di sinilah keajaiban terjadi. Definisikan struct Settings yang sebenarnya dengan field volume dan brightness. Buat variabel pointer static untuk menyimpan satu instance (diinisialisasi dengan NULL). Implementasikan get_settings agar 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. Panggil get_settings dua 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:

  1. Nilai volume yang baru
  2. 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
100

Contoh output saat inputnya adalah 25 dan 60:

25
60

Contoh output saat inputnya adalah 0 dan 50:

0
50

Inti 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online