|
Fabrika Deseni(Factory Pattern) - 1 |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu yazı dizisinde sizlere C++ ile kod yazarken kolaylıkla uygulayabileceğiniz
bir yöntem setinden bahsedeceğim. Bu yöntem setini kullanarak, daha sağlıklı kod
yazabilir ve yazdığınız kodları daha anlaşılır hale getirebilirsiniz. Bir
taraftan da, bu yöntemlerin sizin OOP
becerinizi daha da arttıracağı düşüncesindeyim. Bunun öncesinde sizlerin,
inheritence, pure-virtual method, ve static method
kavramlarına hakim olduğunuzu varsayıyorum.
Bir fabrika düşünelim; bu fabrikada çeşitli nesneler üretilsin. Bir taraftan ham
madde girsin, diğer taraftan üretilen nesneler çıksın. Sizin göreviniz ise hangi
türden nesnenin ne miktarda ve ne özellikte üretileceğine karar vermek olsun.
Fabrikada üretimin CFactory nesnesinin Create metodu ile yapıldığını farzedelim:
CFactory* pakProduct1 = CFactory::Create(PRODUCTID_VCDPLAYER);
CFactory* pakProduct2 = CFactory::Create(PRODUCTID_DVDPLAYER); |
Yukarıdaki örnekte iki farklı türden nesnenin üretildiğini görüyoruz. Burada
dikkat edilecek nokta, nesnelerimizin bazı ortak özellikler taşıyor olmaları;
öncelikle hepsi birer disk oynatıcısı, dolayısı ile Play() ve Stop() isimli gibi
ortak metodlara sahip olduklarını varsayalım.
pakProduct1->Play();
pakProduct2->Stop(); |
Dikkat edelim ki, CFactory adlı nesnemiz aslında, bahsi geçen disk
oynatıcılarından biri olmaktan çok, farklı türden olan disk oynatıcılarına ev
sahipliği yapan bir arayüz nesnesidir. C++ terminolojisinde, ortak bir arayüz ile
farklı olmasına rağmen ortak özellikler içeren nesnelere dolaylı yoldan ulaşma
kavramına polymorphism diyoruz. Şimdi CFactory nesnemize biraz daha
yakından bakalım:
class CFactory
{
public:
static CFactory* Create(const int nProductID);
~CFactory();
private:
CFactory(CProductBase* pkProductBase, const int nProductID);
public:
void Play();
void Stop();
private:
CProductBase* m_pkProductBase;
int m_nProductID;
}; |
CFactory adlı nesnemiz bir arayüz olduğundan bahsettik. Demek ki bu arayüzün
arkasında gerçek işi yapan başka nesneler bulunmakta; yani bir VCD, bir de DVD
oynatıcısı. Bu örneği daha da geliştirecek olsaydık, bunların yanına Divx, MP3,
VHS, vb. gibi diğer bilinen formatların oynatıcılarını da ekleyebilirdik. O
zaman gelin şimdi, arka planda bulunan bu oynatıcıları inheritence
kavramı altında, CProductBase adlı ana bir sınıf altında toplayalım. Bu sayede
CFactory arayüzümüz, sayısız formatı destekleyen oynatıcılar yerine, sadece
bir ana sınıf nesnesi ile iletişim halinde olsun.
class CProductBase
{
public:
CProductBase();
virtual ~CProductBase();
public:
virtual void Play() =0;
virtual void Stop() =0;
}; |
CProductBase adlı ana sınıfımız, pure-virtual
bazı metodlara sahiptir:
Play() ve Stop(). Nasıl ki arayüz nesnemiz CFactory bize bu metodlar için birer arayüz
sağlamış ise, CProductBase’ den türemiş tüm sınıflar da, bu metodları yerine
getirmek zorundadır. Eğer bunu yerine getirmezsek, Visual C++’ ın “error C2259”
ve “warning C4259” uyarıları ile karşılaşırız. Aşağıdaki örnekde,
CProductBase’ den türetilmiş CProductVcdPlayer ve CProductDvdPlayer sınıfları
ilan edilmiştir:
class CProductVcdPlayer: public CProductBase
{
public:
CProductVcdPlayer();
~CProductVcdPlayer();
private:
void Play();
void Stop();
};
class CProductDvdPlayer: public CProductBase
{
public:
CProductDvdPlayer();
~CProductDvdPlayer();
private:
void Play();
void Stop();
}; |
Bunu izleyen bir sonraki yazımızda, yukarıda anlatılan sınıfların
uygulamalarına geçeceğiz. O zamana kadar, kendinize iyi bakın ve güzel yazın.
Eylem Uğurel
[email protected]
Makale:
Fabrika Deseni(Factory Pattern) - 1 C++ ve C++.NET dili Eylem Uğurel
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|