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.
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 tamamen aynı örneği almalıdır.
Kodunuzu üç dosya arasında düzenleyeceksiniz:
settings.h: İleri bildirim kullanarak opak birSettingstürü Declare edin (struct gövdesi gizli kalır). Singleton örneğine bir pointerreturnseden birget_settingsfunction'ı, ayrıca iki yapılandırma değeri için getter ve setter function'ları Declare edin:volume(bir tamsayı) vebrightness(bir tamsayı). Include guard'ları burada gereklidir.settings.c: Sihir burada gerçekleşir.volumevebrightnessfields'larını içeren gerçekSettingsstruct'ını Define edin. Tek örneği tutacak birstaticpointer variable Create edin (NULLolarak başlatılmış).get_settingsfunction'ı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_settingsfunction'ı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:
- Yeni volume değeri
- 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
100Input'lar 25 ve 60 olduğunda örnek çıktı:
25
60Input'lar 0 ve 50 olduğunda örnek çıktı:
0
50Temel çı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;
}
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
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