|
Polymorphism(Çok Biçimlilik) ve Fabrika Deseni - 2 |
|
Gönderiliyor lütfen bekleyin... |
|
|
Sevgili okurlar, bir önceki yazımızda, CFactory ve CProductBase sınıflarının
başlık yapılarını tanımış ve
hatırlayacak olursak CFactory sınıfının polymorphism
kavramını ortaya koyduğunu görmüş, CProductBase sınıfının da inheritence
kavramına değindiğini incelemiştik. Bu
yazımızda ise bu sınıfların uygulama
kodlarını sizlerle paylaşacağız.
Öncelikle CProductBase sınıfıyla işe
başlayalım. Bu sayede aşağıdan-yukarıya bir
patern izlemiş olacağız:
CProductBase::CProductBase()
{
}
CProductBase::~CProductBase()
{
}
|
Gördüğünüz üzere, CProductBase sınıfı pek fazla bir
iş yapmıyor. Onun tek görevi, kendisinden türetilen
sınıflara, ne gibi işleri yapmak mecburiyetinde
olduklarını hatırlatmakdır. Biz bu
hatırlatmayı pure-virtual Play()
ve Stop() metodları ile zaten
sağlamıştık.
Gelelim CProductBase’ den türettiğimiz sınıfların
uygulamalarına; birincisi
CProductVcdPlayer:
CProductVcdPlayer::CProductVcdPlayer()
{
}
CProductVcdPlayer::~CProductVcdPlayer()
{
}
void CProductVcdPlayer::Play()
{
// TODO:
Device specific play code goes here
}
void CProductVcdPlayer::Stop()
{
// TODO:
Device specific stop code goes here
}
|
Ve ikincisi CProductDvdPlayer:
CProductDvdPlayer::CProductDvdPlayer()
{
}
CProductDvdPlayer::~CProductDvdPlayer()
{
}
void CProductDvdPlayer::Play()
{
// TODO:
Device specific play code goes here
}
void CProductDvdPlayer::Stop()
{
// TODO:
Device specific stop code goes here
}
|
Fark ettiğiniz üzere, metodlarımızın iç uygulamalarını tamamen boş
bıraktık. Bunun nedeni, o noktalara yazılacak kodun aslında fabrika paterni ile pek bir
ilgisinin olmamasıdır. Siz kendiniz, fabrika paterni ile bir nesne yapısı kurmayı amaçladığınızda, bu
noktalara yazacağınız kodu zaten biliyor olacaksınız. Örnek verecek olursak, bir resim kütüphanesini ele alalım; bu kütüphane
TGA, BMP, JPG, PNG, vb.. türünden nesneleri okuyacak/yazacak olsun.
İşte yukarıda boş bırakılmış kısımlar, bu farklı türlere özel okuma/yazma rutinlerini içermiş olacak.
Ve son olarak CFactory sınıfına bakalım:
CFactory* CFactory::Create(const int nProductID)
{
CProductBase* pkProductBase =NULL;
switch
(nProductID)
{
case
PRODUCTID_VCDPLAYER:
pkProductBase = new CProductVcdPlayer;
break;
case
PRODUCTID_DVDPLAYER:
pkProductBase = new CProductDvdPlayer;
break;
}
if
(!pkProductBase)
return
NULL;
return
new CFactory(pkProductBase, nProductID);
}
CFactory::~CFactory()
{
switch
(m_nProductID)
{
case PRODUCTID_VCDPLAYER:
delete
(CProductVcdPlayer *)m_pkProductBase;
break;
case
PRODUCTID_DVDPLAYER:
delete
(CProductDvdPlayer *)m_pkProductBase;
break;
}
}
CFactory::CFactory(CProductBase* pkProductBase,
const int nProductID)
{
m_pkProductBase
= pkProductBase;
m_nProductID = nProductID;
}
void CFactory::Play()
{
m_pkProductBase->Play();
}
void CFactory::Stop()
{
m_pkProductBase->Stop();
}
|
Görüldüğü üzere
arayüz sınıfımız olan
CFactory üretimi gerçekleştiriyor ve işi
biten nesnelerin doğru bir şekilde yok edilmelerini
sağlıyor. Bunların yanında,
Play() ve
Stop() metodları ile, sadece
tanıdığı CProductBase
sınıfımızın pure-virtual metodlarını
çağırarak, program akışının ilgili türemiş
nesnelere ulaşmasını sağlıyor.
Sonuç olarak; fabrika paterni OOP uygulama geliştirirken kullanılabilecek etkin
tekniklerden biridir. Uygulama alanları genelde compiler ve interpreter’lar,
geometrik nesne uygulamaları, 3-boyutlu canlandırma uygulamaları
gibi yerlerdir.
Tekrar görüşmek üzere, kendinize iyi bakın ve güzel kodlar yazın.
Eylem Uğurel
[email protected]
Makale:
Polymorphism(Çok Biçimlilik) ve Fabrika Deseni - 2 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
|
|