Menu
Coddy logo textTech

Singleton Kalıbı

Coddy'nin C Journey'sinin Object Oriented Programming 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;
}

Sihir get_config() içinde gerçekleşir. first call instance'ı oluşturur ve başlatır. Sonraki her call aynı pointer'ı returns.

static anahtar sözcüğü, instance değerini function calls arasında korumasını ve diğer dosyalardan gizli kalmasını sağlar.

Başlıktan kullanıcılar yalnızca getter function'ı görür. static variable'a doğrudan erişemez veya onu değiştiremezler. get_config() işlevini kaç kez ya da nereden call edersen et, her zaman aynı nesneyi alırsın.

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 tamamen aynı örneği almalıdır.

Kodunuzu üç dosya arasında düzenleyeceksiniz:

  • settings.h: İleri bildirim kullanarak opak bir Settings türü Declare edin (struct gövdesi gizli kalır). Singleton örneğine bir pointer returns eden bir get_settings function'ı, ayrıca iki yapılandırma değeri için getter ve setter function'ları Declare edin: volume (bir tamsayı) ve brightness (bir tamsayı). Include guard'ları burada gereklidir.
  • settings.c: Sihir burada gerçekleşir. volume ve brightness fields'larını içeren gerçek Settings struct'ını Define edin. Tek örneği tutacak bir static pointer variable Create edin (NULL olarak başlatılmış). get_settings function'ını, first call örneği tahsis edip varsayılan değerlerle (volume: 50, brightness: 75) başlatacak, subsequent calls ise yalnızca existing örneği return edecek şekilde Implement edin. Getter ve setter'ları gizli fields'lara erişecek ve onları değiştirecek şekilde Implement edin.
  • main.c: Singleton'ın doğru çalıştığını gösterin. Yeni volume ve brightness değerlerini temsil eden iki tamsayı okuyun. get_settings function'ını iki kez Call edin ve sonuçları two different pointer variable'larında saklayın. volume ve brightness'ı input değerleriyle güncellemek için first pointer'ı kullanın. Ardından her iki değeri retrieve edip print etmek için second pointer'ı kullanın. Singleton çalışıyorsa, one pointer üzerinden yapılan değişiklikler other pointer üzerinden görünür olacaktır.

Programınız two input alacaktır:

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

One pointer üzerinden değiştirdikten ve other pointer üzerinden okuduktan sonra volume ve brightness'ı ayrı satırlarda print edin.

Input'lar 80 ve 100 olduğunda örnek çıktı:

80
100

Input'lar 25 ve 60 olduğunda örnek çıktı:

25
60

Input'lar 0 ve 50 olduğunda örnek çıktı:

0
50

Temel çıkarım, both pointers'ın bellekte aynı nesneyi point etmesidir: Singleton deseninin özü budur. Kaynak dosyanızın içindeki static variable, yalnızca one instance'ın var olmasını sağlar ve bu instance programın entire lifetime'ı boyunca varlığını sürdürü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.

Object Oriented Programming bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi