Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 29.10.2003
Okunma Sayısı : 55372
Yorum Sayısı : 5     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 28.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 28.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 28.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 28.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Abstract Factory Tasarım Deseni(Design Pattern)
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Singleton deseni ile başladığım "design pattern" yazı dizisine "Abstract Factory" deseni ile devam ediyoruz. Bu yazıda "Creational" desenler grubunun en önemli ve en sık kullanılan deseni olan Abstract Factory(Soyut Fabrika) tasarım deseninin C# ile ne şekilde uygulandığını bir örnek üzerinden göstereceğim.

İlk yazımda da bahsettiğim gibi "Creational" grubundaki desenler bir yada daha çok nesnenin çeşitli şekillerde oluşturulması ile ilgili desenlerdir. Bu kategoride ele alınan "Abstract Factory" ise birbirleriyle ilişkili yada birbirlerine bağlı olan nesnelerin oluşturulmasını en etkin bir şekilde çözmeyi hedefler. Bu hedefe ulaşmak için soyut sınıflardan(abstract class) veya arayüzlerden(interface) yoğun bir şekilde faydalanmaktadır. "Abstract Factory" deseninin ana teması belirli sınıfların içerdiği ortak arayüzü soyut bir sınıf yada arayüz olarak tasarlamaktır. Böylece nesneleri üreten sınıf, hangi nesnenin üretileceği ile pek fazla ilgilinmesi gerekmez. İlgilenmesi gereken nokta oluşturacağı nesnenin hangi arayüzleri desteklediği yada uyguladığıdır. Bahsi geçen mekanizmalarla deseni oluşturduğumuz anda çalışma zamanında hangi nesnenin oluşturulması gerektiğini bilmeden nesnelerin oluşturulmasını yönetebiliriz.

Eğer bir nesne oluşturacaksanız ve tam olarak hangi nesnenin oluşturulacağına bir switch yada if deyimi ile karar veriyorsanız muhtemelen her nesneyi oluştruduğunuzda aynı switch yapısını kullanmak zorunda kalacaksınız. Bu tür tekrarları önlemek için "Abstarct Factory" deseninden faydalanılabilir. Bu elbetteki nesnelerin ortak bir arayüzü uygulamış olma zorunluluğunun getirdiği bir faydadır.

Şimdi de gerçek dünyadan bir örnek vererek "Abstract Factory" deseninin hangi durumlarda kullanabileceğimizi ve soyut fabrika mantığını netleştirelim. Bir CD sürücüsü düşünün. CD sürücüsü kendisine sürülen CD leri okumakla sorumludur. Hiç bir zaman sürülen CD nin şekli ve biçimiyle ilgilenmez. Ama sürülen CD nin okunabilmesi için de belirli şartların yerine getirildiğini farzeder. Yani siz CD sürücüsüne CD olmayan ama CD ye benzeyen bir cisim yerleştiriseniz onu da okumaya çalışır.(eğer CD sürücünüz bozulmazsa!) Çünkü okumaya çalıştığı cismin ne olduğu ile pek ilgilenmez CD sürücüsü. Buradaki örnekte CD sürücüsünün okuma yapabilmesi için gereken şartları bir soyut fabrika sınıfı ile modelleyebiliriz. Kare yada daire şeklindeki gerçek CD ler ise bu soyut fabrika sınıfı tarafından belirlenen şartları destekleyen gerçek nesnelerdir. CD sürücüsünün kendisi ise soyut fabrika tarafından belirlenen standartlar çerçevesi içerisinde CD nin ne tür bir CD olduğundan bağımsız bir şekilde bilgiyi okuyan birimdir. Bu, "abstract factory" desenindeki client yani istemci sınıfa denk düşer ki bu sınıf nesnelerin yaratılmasından sorumludur.

Bu giriş bilgilerinden sonra "abstract factory" deseninin temel özelliklerini kısaca özetleyelim.

  • "Abstract Factory", nesneleri oluşturan bir sınıftır. Oluşturulan bu nesneler birbirleriyle ilişkili olan nesnelerdir. Diğer bir deyişle aynı arayüzü uygulamış olan nesnelerdir.

  • Üretilen nesnelerin kendisiyle ilgilenilmez. İlgilenilen nokta oluşturulacak nesnelerin sağladığı arayüzlerdir. Dolayısıyla aynı arayüzü uygulayan yeni nesneleri desene eklemek çok kolay ve esnektir.

  • Bu desende üretilecek nesnelerin birbirleriyle ilişkili olması beklenir.
UML Modeli

Aşağıdaki şekil "abstract factory" tasarım deseninin yapısal UML diagramını göstermektedir. Şemadaki her bir şekil desendeki bir sınıfı modellemektedir. Ayrıca desendeki sınıflar arasındaki ilişkilerde detaylı bir şekilde gösterilmiştir.





Yukarıda şemayı kısaca açıklamakta fayda var. Şemadan da görüleceği üzere "abstract factory" deseninde 3 ana yapı vardır. İlk yapı nesnelerin oluşturulmasından sorumlu soyut ve gerçek fabrikalar, ikinci yapı soyut fabrikadan türeyen gerçek fabrikaların ürettiği ürünleri temsil eden soyut ve gerçek ürün sınıflar, son yapı ise herhangi bir ürünü, kendisine parametre olarak verilen soyut fabrikaları kullanarak üreten istemci(client) sınıfıdır.

SoyutFabrika sınıfı gerçek fabrikaların uygulaması gereken arayüzü temsil eder. Bu sınıf, bütün metotları soyut olan sınıf olabileceği gibi bir arayüz de olabilir. Uygulamanızın ihtiyacına göre dilediğinizi kullanabilirsiniz. SoyutFabrika sınıfında ürün1 ve ürün2'nin üretilmesinden sorumlu iki tane metot bulunmaktadır. Dolayısıyla bütün gerçek fabrikaların hem ürün1'i hemde ürün'yi ürettiği kabul edilmektedir. Her bir ürünün ortak özelliklerini belirlemek ve ana yapıda toplamak için SoyutUrun1 ve SoyutUrun2 sınıfları oluşturulur. Bu sınıflarda herhangi bir ürüne özel bilgi bulunmamaktadır. Asıl bilgi bu soyut ürünlerden türeyen GercekUrun sınıflarında bulunmaktadır. Her bir fabrikanın ürettiği ürünleri modelleyen sınıflarda yukarıdaki şekilde gösterilmiştir. Asıl önemli mesele ise gerçek fabrikaların üretimden sorumlu metotlarının ne şekilde geri döneceğidir. Yukarıdaki şemadan da görüleceği üzere bu metotlar üreteceği ürünün soyut sınıfına dönmektedir. Yani üretim sonucunda geri dönen gerçek ürün nesnesi değildir. Şemada Client olarak gösterilen sınıfın yapısı ise şu şekildedir : Client sınıfı yapıcı metoduna bir soyut fabrika nesnesi alır. Ve soyut fabrikanın üretimden sorumlu metotlarını kullanarak soyut ürünleri üretir. Dikkat ederseniz Client sınıfı hangi gerçek fabrikanın üretim yaptığından ve üretilen ürünün gerçek özelliklerinden haberi yoktur. Client sadece soyut fabrikanın içerdiği temel özelliklerin farkındadır. Bunu şemadaki kalın ve kesikli oklardan görmek mümkündür.

Desenin C# ile Gerçekleştirilmesi

Yukarıdaki yapısal örneği verdikten sonra gerçek bir örnek ile bu deseni nasıl gerçekleştirebileceğimizi inceleyelim. Bu örnekte araba kasası ve araba lastiği üreten farklı iki firmanın üretimi modellenmektedir.

Önce örneği kabaca inceleyin, ardından açıklamaları okuyun.


using System; namespace DesignPattern
{
    abstract class SoyutArabaFabrikasi
    {
        abstract public SoyutArabaKasasi KasaUret();
        abstract public SoyutArabaLastigi LastikUret();
    }

    class MercedesFabrikasi : SoyutArabaFabrikasi
    {
        public override SoyutArabaKasasi KasaUret()
        {
            return new MercedesE200();
        }

        public override SoyutArabaLastigi LastikUret()
        {
            return new MercedesLastik();
        }
    }

    class FordFabrikasi : SoyutArabaFabrikasi
    {
        public override SoyutArabaKasasi KasaUret()
        {
            return new FordFocus();
        }

        public override SoyutArabaLastigi LastikUret()
        {
            return new FordLastik();
        }
    }

    abstract class SoyutArabaKasasi
    {
        abstract public void LastikTak(SoyutArabaLastigi a );
    }

    abstract class SoyutArabaLastigi
    {
    }

    class MercedesE200 : SoyutArabaKasasi
    {
        public override void LastikTak(SoyutArabaLastigi lastik)
        {
            Console.WriteLine( lastik + " lastikli MercedesE200");
        }
    }


    class FordFocus : SoyutArabaKasasi
    {
        public override void LastikTak(SoyutArabaLastigi lastik)
        {
            Console.WriteLine( lastik + " lastikli FordFocus");
        }

    }


    class MercedesLastik : SoyutArabaLastigi
    {

    }

    class FordLastik : SoyutArabaLastigi
    {

    }

    class FabrikaOtomasyon
    {
        private SoyutArabaKasasi ArabaKasasi;
        private SoyutArabaLastigi ArabaLastigi;

        public FabrikaOtomasyon( SoyutArabaFabrikasi fabrika )
        {
            ArabaKasasi = fabrika.KasaUret();
            ArabaLastigi = fabrika.LastikUret();
        }

        public void LastikTak()
        {
            ArabaKasasi.LastikTak( ArabaLastigi );
        }
    }

    class UretimBandi
    {
        public static void Main()
        {
            SoyutArabaFabrikasi fabrika1 = new MercedesFabrikasi();
            FabrikaOtomasyon fo1 = new FabrikaOtomasyon( fabrika1 );
            fo1.LastikTak();

            SoyutArabaFabrikasi fabrika2 = new FordFabrikasi();
            FabrikaOtomasyon fo2 = new FabrikaOtomasyon( fabrika2 );
            fo2.LastikTak();
        }
    }
}


Yukarıdaki örnekte SoyutArabaFabrikasi sınfı iki metot içermektedir. Bu metotlar SoyutArabaFabrikasi sınıfından türeyecek sınıfların uygulaması gereken metotlardır. Çünkü metotlar abstract olarak bildirilmiştir. Bu metotlar gerçek fabrika sınıflarının araba kasası ve araba lastiği üretmesi gerektiğinin belirtisidir. Zira görüldüğü üzere SoyutArabaFabrikasi sınıfından türeyen MercedesFabrikasi ve FordFabrikasi kendilerine has lastikleri ve kasaları üretmek için soyut fabrika sınıfının metotlarını kullanmaktadır. Bu metotlar geri dönüş değeri olarak soyut ürün sınıflarını temsil eden sınıfları döndürmektedirler. Örneğin KasaUret() metodu her bir fabrika için farklı ürün üretmesine rağmen her bir ürün SoyutArabaKasasi sınıfındaki metotları uyguladığı için gerçek ürünler birbirleyile ilişkili hale gelir. Mercedes fabrikası KasaUret() metodu ile MercedesE200 ürününü döndürmesine rağmen Ford fabrikası aynı metotla FordFocus ürününü döndürmektedir. Ancak her iki fabrikanın da ürettiği ürün SoyutArabaKasasi sınıfından türediği için herhangi bir çelişki olmamaktadır.

SoyutArabaKasasi sınıfındaki LastikTak() sınıfı fabrikadan üretilen ürünlerin birbirleriyle karıştırılmadan esnek bir şekilde nasıl ilişkilendirildiğini gösterilmektedir. Bu metot parametre olarak gerçek lastik ürünü yerine soyut lastik ürünü alır. Dolayısıyla herhangi bir fabrikadan üretilen lastik ürünü bu metoda parametre olarak geçirilebilir.

FabrikaOtomasyon sınıfı kendisine verilen bir soyut fabrika nesnesi üzerinden kasa ve lastik üretir ve üretilen lastiği, lastiğin gerçek türünü bilmeden üretilen araba kasası ile ilişkilendirir. Dikkat ederseniz bu sınıf üretimin yapılacağı fabrikanın hangi fabrika olduğu ve üretilen ürünlerin gerçekte hangi ürünler olduğu ile ilgilenmez.

Son olarak tasarladığımız bütün bu sınıfları test edecek UretimBandı sınıfını inceleyelim. Bu sınıf içerisinde ürünleri üretilecek fabrikanın soyut nesnesi oluşturulur ve FabrikaOtomasyonu nesnesine parametre olarak verilir. SoyutFabrika nesnesini alan FabrikaOtomasyonu bu nesnenin standart üretimden sorumlu metotlarını kullanarak kasa ve lastik üretir. Ardından SoyutArabaKasasi sınıfının LastikTak() metodunu kullanarak kasa ve lastik ürünlerini ilişkilendirir.

Bu örnekte kullanılan soyut sınıfların yerine arayüzleride kullanmak mümkündür. Daha önce de dediğim gibi siz uygulamanızın durumuna göre herhangi birini seçebilirsiniz.

Diğer bir "Creational" deseni olan "Builder" desenini anlatacağım yazıda görüşmek üzere...
Makale:
Abstract Factory Tasarım Deseni(Design Pattern) C#, Visual C# ve .NET Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
KAS
4
2010
Yazı dizisi için teşekkür ederim. Sade ve anlaşılır...
AĞU
7
2010
Hata yok kod çalışıyor,yazdıklarınızı tekrar kontrol edin derim.
TEM
25
2010
lastik değişkeni bulunamıyor hatası var.
ŞUB
9
2004
aslında yaratılan gerçek ürün ancak, metodun geri dönüş değeri olarak soyut sınıfı döndürmek daha mantıklı olur maksadıyla yapılmış. Ne de olsa soyut sınıfı gerçek ürüne referans edebiliyoruz
ŞUB
8
2004
UML diyagramı üzerinden giderek şunu sormak istiyorum; public class GercekUrun1_a extends SoyutUrun1{ SoyutUrun1 s = new GercekFabrika1().Urun1_uret(); } GercekUrun1_a sınıfında, gercek nesne değil de SoyutUrun1 objesinin yaratılmasının amacı nedir, yani neden direkt olarak GercekUrun1_a yaratılmadı?
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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