30 Nisan 2013 Salı

SİNGLETON PATTERN NEDİR( SİNGLETON TASARIM MODELİ )


              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 ...




2 yorum:

  1. class S
    {
    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?

    YanıtlaSil