C++'da Singleton Nasıl Oluşturulur

C Da Singleton Nasil Olusturulur



C++'da singleton, program boyunca sınıfın tek bir örneğinin varlığını garantileyen ve bu belirli örneğe küresel bir erişim noktası sağlayan bir tasarım ilkesidir.

Singleton modeli genellikle veritabanı bağlantısı, günlükçü veya konfigürasyon yöneticisi gibi global olarak erişilmesi gereken tek, paylaşılan bir kaynağa ihtiyacınız olduğunda kullanılır. Tek bir örneği zorlayarak programın birden fazla bölümünün aynı nesneye erişmesine ve değiştirmesine olanak tanır, veri tutarlılığını artırır ve küresel değişkenlere olan ihtiyacı azaltır. Singleton, sık kullanılan veya oluşturulması pahalı olan nesnelerin uygulama boyunca saklandığı ve yeniden kullanıldığı bir nesne önbelleği olarak kullanılabilir. Bu yaklaşım, gereksiz nesne oluşturma ve başlatma işlemlerini önleyerek performansı artırmaya yardımcı olur.

Bu yazımızda singleton oluşturulmasını açıklayacağız ve C++ programında singleton stilize etme örneğini göstereceğiz.







Örnek 1: İstekli Başlatma ile Basit Bir Singleton Oluşturma

Erken başlatmaya sahip basit bir singleton, bir sınıfın yalnızca bir örneğinin oluşturulmasını ve statik başlatma sırasında istekli bir şekilde oluşturulmasını sağlayan bir tasarım modelidir.



İstekli başlatmaya sahip basit bir singleton oluşturmak için temel kod pasajını göstereceğiz. Programa başlayalım:



#include

sınıf Tekil {
özel :
statik Tekil * misal ;
Tekil ( ) { }
halk :
statik Tekil * getInstance ( ) {
geri dönmek misal ;
}
} ;


Tekil * Tekil :: misal = yeni Singleton ( ) ;

int ana ( ) {

Tekil * singletonInstance1 = Tekil :: getInstance ( ) ;

Tekil * singletonInstance2 = Tekil :: getInstance ( ) ;

std :: cout << 'singletonletonInstance1: ' << singletonInstance1 << std :: sonunda ;

std :: cout << 'singletonletonInstance2: ' << singletonInstance2 << std :: sonunda ;

geri dönmek 0 ;

}

Kod, “std::cout” gibi giriş ve çıkış akışlarıyla çalışma işlevselliği sağlayan başlığını içerir.





Başlık dosyasını ekledikten sonra singleton kalıp uygulamasını temsil eden “Singleton” sınıfını tanımlıyoruz. Özel bir kurucuya ve “örnek” adında özel bir statik üye değişkenine sahiptir.

Daha sonra getInstance() işlevi, “Singleton” sınıfının genel statik üye işlevi olarak uygulanır. Statik üye değişken örneğinde saklanan singleton örneğini döndürür. Statik üye değişken örneği, 'Singleton* Singleton::instance = new Singleton();' ile sınıfın dışında tanımlanır ve başlatılır. Bu satır, statik başlatma sırasında “Singleton” sınıfının örneğini hevesle başlatır.



Main() işlevinde, “singletonInstance1” ve “singletonInstance2” olmak üzere iki işaretçi bildiririz ve Singleton::getInstance() öğesini çağırarak döndürülen değeri atarız. Örnek hevesle başlatıldığından, her iki işaretçi de aynı örneği işaret eder. “std::cout” ifadeleri “<<” operatörünü ve “std::endl”yi kullanarak “singletonInstance1” ve “singletonInstance2” bellek adreslerini konsola yazdırır.

Kod, programın başarılı bir şekilde yürütüldüğünü gösteren '0 dönüşü' ile biter.

Bu kodu çalıştırdığınızda çıktı şuna benzer:

Çıkış, “singletonInstance1” ve “singletonInstance2” bellek adreslerini görüntüler. Her iki işaretçi de Singleton::getInstance()'tan alınan aynı örnekle atandığından, aynı bellek adresine sahiptirler. Bu, singleton modelinin sınıfın tek bir örneğinin olduğunu ve getInstance()'a yapılan gelecekteki çağrıların her zaman aynı örnekle sonuçlanacağını nasıl garanti ettiğini gösterir.

Örnek 2: Tembel Başlatma ile Tekil Desen Uygulaması

Bu gösterim, tembel başlatma ile tekil desen uygulamasını açıklar ve bunun main() işlevindeki kullanımını gösterir. Kod pasajının adım adım açıklaması bu programdan sonra verilmiştir:

#include

sınıf Tekil {

özel :

statik Tekil * misal ;

Tekil ( ) {

std :: cout << 'Singleton örneği oluşturuldu.' << std :: sonunda ;

}

halk :

statik Tekil * getInstance ( ) {

eğer ( misal == nullptr ) {

misal = yeni Singleton ( ) ;

}

geri dönmek misal ;

}

geçersiz showMessage ( ) {

std :: cout << 'Singleton'dan merhaba!' << std :: sonunda ;

}

~Tekton ( ) {

std :: cout << 'Singleton örneği yok edildi.' << std :: sonunda ;

}

} ;

Tekil * Tekil :: misal = nullptr ;

int ana ( ) {

Tekil * singletonInstance1 = Tekil :: getInstance ( ) ;

singletonInstance1 -> showMessage ( ) ;

Tekil * singletonInstance2 = Tekil :: getInstance ( ) ;

singletonInstance2 -> showMessage ( ) ;

geri dönmek 0 ;

}

Program, giriş/çıkış görevlerini gerçekleştirmek için başlık dosyasını ekleyerek başlar. Daha sonra “Singleton” sınıfını deklare edip tanımlıyoruz. Sınıfın tek örneği “instance” adı verilen özel statik üye değişkeninde tutulur.

“Singleton” sınıfının yapıcısı her çağrıldığında “Singleton” sınıfının bir örneğini oluşturur. “std::cout << … << std::endl;” kullanarak konsola “Singleton örneği oluşturuldu” mesajını gönderir. Yapıcı, varsayılan bir kurucu olduğundan herhangi bir parametreye sahip değildir. Herhangi bir argüman olmadan Singleton() olarak tanımlanır. Bunu özel olarak ilan ediyoruz, bu da onun yalnızca sınıfın içinden çağrılabileceği anlamına gelir. Bu, 'Singleton' sınıfının doğrudan başlatılmasını önler ve bir örnek edinmenin tek yolunun getInstance() işlevi aracılığıyla olmasını sağlar.

“Singleton” sınıfının getInstance() yöntemi, genel statik üye işlevi olarak bildirilir. Singleton örneğinin erişilebilirliğini kurma ve verme rolündedir. getInstance()'ın içinde örneğin 'nullptr' olup olmadığını kontrol eder. Eğer öyleyse, örneğin halihazırda mevcut olmadığını belirtmek için 'Singleton' sınıfının yeni bir nesnesini başlatmak için özel kurucuyu kullanır.

showMessage() işlevi, 'Singleton'dan Merhaba!' mesajını görüntüleyen basit bir üye işlevidir. İleti. Singleton'un yıkıcısı tanımlandı. Program sonlandırıldığında ve 'Singleton örneği yok edildi' ifadesini yazdırdığında dolaylı olarak çağrılır. singleton örneğinin yok edildiğini belirten mesaj. Statik üye değişken örneği başlangıçta “nullptr” olarak tanımlanır.

int main(), main() fonksiyonunun tanımını başlatır. Ardından, “Singleton* singletonInstance1 = Singleton::getInstance();” singleton örneğine bir işaretçi elde etmek için “Singleton” sınıfının getInstance() işlevini çağırır. Bu işaretçiyi “singletonInstance1” değişkenine atar.

Bundan sonra “singletonInstance1->showMessage();” “singletonInstance1” işaretçisindeki showMessage() işlevini çağırmak için ok operatörünü (->) kullanır. Bu işlev, içinde belirtilen mesajı konsolda görüntüler. Daha sonra “Singleton* singletonInstance2 = Singleton::getInstance();” singleton örneğine başka bir işaretçi elde ederek getInstance() işlevini yeniden çağırır. Bu sefer işaretçiyi “singletonInstance2” değişkenine atar. “singletonInstance2->showMessage();” “singletonInstance2” işaretçisindeki showMessage() işlevini çağırır. Bu işlev “Singleton'dan Merhaba!” Konsola tekrar mesaj gönderin.

Son olarak “0’a dön;” main() fonksiyonunun sonunu belirtir ve program, programın başarılı bir şekilde yürütüldüğünü gösteren 0 değerini döndürür.

Daha önce açıklanan kod pasajının çıktısı şöyle:

Bu sonuç, 'Singleton' sınıfının yalnızca bir örneğin oluşturulmasını sağladığını ve getInstance() işlevine yapılan daha fazla çağrının güvenilir bir şekilde aynı örneği verdiğini doğrular.

Çözüm

C++'da singleton oluşturmak çok kullanışlı bir kavramdır. Bu yazımızda öncelikle singleton'un giriş kısmını ele aldık. Ayrıca C++'ta singleton'u uygulamak için iki örnek üretildi. İlk çizim istekli singleton başlatmanın uygulanmasını göstermektedir. Oysa singleton modelinin tembel başlatma uygulaması bu makalenin ikinci örneğinde verilmiştir. Ayrıca üretilen çıktının anlık görüntüleri de ilgili programlar için görüntülenir.