Singleton pattern yapısı,
bir uygulamada oluşturduğumuz classtan sadece 1 tane üretilmesine izin veren
daha fazlasına izin vermeyen yapıdır.
Yaratılan
nesne sınırlı verilerin üretilmesini sağlar. Örnek verecek olursak network
üzerinden veya veri tabanı üzerinden çalışan programlar olabilir. Peki genel yapısı çok basit olan bu yapıyı
nasıl koda dökebiliriz ve koda dökerken neler yapmalıyız ?
Yandaki
UML diagramda da görüldüğü gibi İlk olarak klasımızdan tek bir nesne üretebilmemiz için constructor'ı private olarak tanımlamalıyız ki main den nesne üretmek istediğimizde izin
verilmemesi için. İkinci olarak static bir get fonksiyonu oluşturmalıyız ve bu
fonksiyon bulunduğu class tipinde nesne döndürecek. Bu işlemi de fonksiyonun
içinde nesne olup olmadığını kontrol edip yoksa ilk nesneyi yaratacak eğer
kalsımıza ait nesnemiz varsa var olan nesneyi döndürecek. Ayrıca bu fonksiyonu
static olarak tanımlamamız gerekmektedir çünkü mainden Singleton::getInstance () ; şeklinde çağırma yapabilmemiz için. Son olarak ta
bu fonksiyonun tek seferlik değer ataması yapıp döndüreceği bir pointer’a
ihtiyacımız var. Bu pointer’ı private olarak tanımlamamız ve mainin üzerinde
ilk değer ataması yapmamız singleton pattern yapısı için yeterli olacaktır.
kod kısmında iki farklı class oluşturdum bunların biri
singleton pattern yapısına sahip diğeri ise normal aşağıda da görüldüğü gibi
singleton class'ı sadece 1 tane nesne üretebiliyorken normal class birden fazla
üretebilir.
Kod :
#include<iostream>
using namespace std ;
class Singleton {
private :
static Singleton *uniqueinstance;
Singleton(){}
public :
static Singleton *getuniqueInstance ()
{
if(uniqueinstance == NULL)
{
uniqueinstance = new Singleton();
}
return uniqueinstance;
}
void print ()
{
cout<<"Singleton class ... "<<endl ;
}
};
class Normal {
private :
static Normal *uniqueinstance;
public :
Normal(){}
Normal *getuniqueInstance ()
{
return uniqueinstance;
}
void print ()
{
cout<<"Normal class ... "<<endl ;
}
};
Singleton * Singleton::uniqueinstance=0;
// ilk değer ataması ...
int main () {
Singleton *p =Singleton::getuniqueInstance () ;
p->print();
//Singleton
*k = new Singleton () ; // ERROR !!!
Normal *n = new Normal() ;
Normal *l = new Normal() ;
n->print();
l->print();
system("pause
");
return 0 ;
}
Output :
Programda da görüldüğü gibi sadece tek bir nesne üzerinden
işlemler yapılıyor ve her seferinde fonksiyon çağrıldığında ilk yaratılan
pointer döndürülüyor.
Zaman ayırdığınız için teşekkürler J
Lütfen yorum yapınız ...
ARO karşim
YanıtlaSilclass S
YanıtlaSil{
public:
static S& getInstance()
{
static S instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
S() {}; // Constructor? (the {} brackets) are needed here.
// Dont forget to declare these two. You want to make sure they
// are unaccessable otherwise you may accidently get copies of
// your singleton appearing.
S(S const&); // Don't Implement
void operator=(S const&); // Don't implement
};
sizce hangi yöntem daha iyi?