Menu
Coddy logo textTech

Singleton Kalıbı

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 54 / 61.

Bazen programınızın tamamı boyunca bir nesnenin tam olarak bir örneğine ihtiyaç duyarsınız: bir yapılandırma yöneticisi, bir günlük kaydı sistemi veya bir veritabanı bağlantısı. Singleton deseni, yalnızca bir örneğin var olmasını sağlar ve ona küresel bir erişim noktası sunar.

C'de bunu bir kaynak dosyanın içinde static bir değişken kullanarak uygularız. Dosya kapsamındaki static ifadesinin, değişkenin o dosyaya özel olduğu ve programın ömrü boyunca varlığını sürdürdüğü anlamına geldiğini unutma. Bir getter işleviyle birleştirildiğinde bu, Singleton'ımızı oluşturur:

// 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;
}

Asıl sihir get_config() içinde gerçekleşir. İlk çağrı örneği oluşturur ve başlatır. Sonraki her çağrı aynı işaretçiyi döndürür.

static anahtar sözcüğü, instance değerini işlev çağrıları arasında korumasını ve diğer dosyalardan gizli kalmasını sağlar.

Başlık dosyasından kullanıcılar yalnızca getter işlevini görür. Statik değişkene doğrudan erişemez veya onu değiştiremezler. get_config() işlevini kaç kez veya nereden çağırırsanız çağırın, her zaman aynı nesneyi alırsınız.

challenge icon

Görev

Kolay

Singleton desenini kullanarak uygulama genelindeki yapılandırmayı yöneten bir Settings modülü oluşturalım. Kodunuz ayarları kaç kez isterse istesin, her zaman aynı örneği almalıdır.

Kodunuzu üç dosya arasında düzenleyeceksiniz:

  • settings.h: İleri bildirim kullanarak opak bir Settings türü bildirin (yapı gövdesi gizli kalır). Singleton örneğine işaretçi döndüren bir get_settings işlevinin yanı sıra iki yapılandırma değeri için alıcı ve ayarlayıcı işlevler bildirin: volume (bir tamsayı) ve brightness (bir tamsayı). Include korumaları burada gereklidir.
  • settings.c: Sihir burada gerçekleşir. volume ve brightness alanlarına sahip gerçek Settings yapısını tanımlayın. Tek örneği tutmak için NULL ile başlatılmış bir static işaretçi değişkeni oluşturun. İlk çağrıda örneği ayırıp varsayılan değerlerle (volume: 50, brightness: 75) başlatacak, sonraki çağrılarda ise yalnızca mevcut örneği döndürecek şekilde get_settings işlevini uygulayın. Gizli alanlara erişmek ve onları değiştirmek için alıcı ve ayarlayıcı işlevlerini uygulayın.
  • main.c: Singleton'ın doğru çalıştığını gösterin. Yeni volume ve brightness değerlerini temsil eden iki tamsayı okuyun. get_settings işlevini iki kez çağırarak sonuçları iki farklı işaretçi değişkeninde saklayın. İlk işaretçiyi kullanarak volume ve brightness değerlerini giriş değerleriyle güncelleyin. Ardından ikinci işaretçiyi kullanarak her iki değeri alın ve yazdırın. Singleton düzgün çalışıyorsa, bir işaretçi üzerinden yapılan değişiklikler diğer işaretçi üzerinden görünür olacaktır.

Programınız iki girdi alacaktır:

  1. Yeni volume değeri
  2. Yeni brightness değeri

Bir işaretçi üzerinden değiştirdikten ve diğer işaretçi üzerinden okuduktan sonra volume ve brightness değerlerini ayrı satırlarda yazdırın.

Girdiler 80 ve 100 olduğundaki örnek çıktı:

80
100

Girdiler 25 ve 60 olduğundaki örnek çıktı:

25
60

Girdiler 0 ve 50 olduğundaki örnek çıktı:

0
50

Temel çıkarım, her iki işaretçinin de bellekte aynı nesneyi göstermesidir: Singleton deseninin özü budur. Kaynak dosyanızdaki static değişken, yalnızca bir örneğin var olmasını sağlar ve bu örnek programın tüm ömrü boyunca kalıcıdır.

Kendin dene

#include <stdio.h>
#include "settings.h"

int main() {
    int new_volume, new_brightness;
    scanf("%d", &new_volume);
    scanf("%d", &new_brightness);
    
    // TODO: get_settings'i iki kez çağır ve iki farklı pointer değişkeninde sakla
    
    
    // TODO: İlk pointer'ı kullanarak volume ve brightness'ı girdi değerleriyle güncelle
    
    
    // TODO: İkinci pointer'ı kullanarak volume ve brightness'ı al ve yazdır
    // (Bu, her iki pointer'ın da aynı singleton örneğine işaret ettiğini gösterir)
    
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi