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.
Görev
KolaySingleton 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 birSettingstürü bildirin (yapı gövdesi gizli kalır). Singleton örneğine işaretçi döndüren birget_settingsişlevinin yanı sıra iki yapılandırma değeri için alıcı ve ayarlayıcı işlevler bildirin:volume(bir tamsayı) vebrightness(bir tamsayı). Include korumaları burada gereklidir.settings.c: Sihir burada gerçekleşir.volumevebrightnessalanlarına sahip gerçekSettingsyapısını tanımlayın. Tek örneği tutmak içinNULLile başlatılmış birstaticiş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 şekildeget_settingsiş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_settingsiş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:
- Yeni volume değeri
- 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
100Girdiler 25 ve 60 olduğundaki örnek çıktı:
25
60Girdiler 0 ve 50 olduğundaki örnek çıktı:
0
50Temel çı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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi