11 Temmuz 2013 Perşembe

TEMPLATE METHOD PATTERN

Template method gerekli işlemleri soyut olarak tanımlar ve algoritma iskeleti belirler. Bazı adımların gerçekleştirilmesi alt sınıflara bırakılır ve bu adımlar gerçekleştirilirken algoritmanın ana yapısı değişmez.
Template method ile alt sınıflardaki ortak adımlarda kod tekrarının önüne geçilir ve kod tekrar kullanılabilir. Ayrıca bu method sayesinde kod değiştirilmek istenirse tek bir yerden değiştirilebilir.




Mesela iki tane sınıfımız olsun Class1 ve Class2 adıyla. Bu sınıflar Base sınıfından türetilsin ve sınıfların ortak fonksiyonları functionA() ve functionD() olsun. Ortak fonksiyonlar Base sınıfında private olarak, ortak olmayanlar ise protected içinde abstract olarak tanımlanır. Public olan process() ise bütün fonksiyonları çağırıcı olarak rol yapar.Koda geçersek:

class Base{
private:
       void functionA(){
             cout<<"Common function A for both Class1 and Class2..."<<endl;
       }

       void functionD(){
           cout<<"Common function D for both Class1 and Class2..."<<endl;
    }

protected:
       virtual void functionB()=0;
       virtual void functionC()=0;
       virtual void functionE()=0;

public:
       void process(){
           functionA();
           functionB();
           functionC();
           functionD();
           functionE();
       }

};


Base sınıfta protected olarak tanımlanmış ortak olmayan fonksiyonlar, bu sınıftan türetilmiş olan Class1 ve Class2 sınıflarında public olarak tanımlanır ve kendilerine ait özellikleri taşır.

class Class1:public Base{
public:
       void functionB(){
             cout<<"Function B for Class1..."<<endl;
       }
       void functionC(){
             cout<<"Function C for Class1..."<<endl;
       }
       void functionE(){
             cout<<"Function E for Class1..."<<endl;
       }
};


class Class2:public Base{
public:
       void functionB(){
             cout<<"Function B for Class2..."<<endl;
       }
       void functionC(){
             cout<<"Function C for Class2..."<<endl;
       }
       void functionE(){
             cout<<"Function E for Class2..."<<endl;
       }

};



Main de ise nesne oluşturulurken ve process() fonksiyonu çağırılırken:

      Base *c1=new Class1();
       Base *c2=new Class2();

       c1->process();
       c2->process();

8 Temmuz 2013 Pazartesi

SINGLETON PATTERN

Singleton Pattern belirli bir nesneden sadece bir örneğinin olmasını ve yaratılan bu tek nesneye global olarak erişimi sağlar.  Bir sınıf alınır ve tek bir örneğini yönetmek için izin verilir. Bir örneği elde etmek için sınıfın kendisi üzerinden gidilmelidir. Başka bir sınıfta yeni bir örnek oluşturulamaz. Bir örneğe ihtiyacımız olduğunda sınıfı sorgularız ve tek bir örnek bize döndürülür. 








uniqueInstance değişkeni bizim oluşturacağımız tek bir örneği temsil eder. getInstance() fonksiyonu ise class dışından ulaşılabilmesi için public olarak tanımlanır. Bu fonksiyon içinde tek nesne oluşturulur. Kod kısmına geçersek:



class Singleton {
private:
       static Singleton *uniqueInstance;
       Singleton() {...}

public
       static Singleton* getInstance(){
             if(uniqueInstance == NULL){
                    uniqueInstance = new Singleton();
             }
             return uniqueInstance; 
       }
}