Makale Özeti

Tasarım Kalıpları yazılım tasarımında meydana gelen bir birinin aynı veya da bir birinine büyük oranda benzeyen problemleri çözmek amacıyla ortaya atılan çözüm önerileridir. İlk olarak GANG OF FOUR (GOF)* tarafından ortya atıldı.Tasarım kalıpları programlama dilinden bağımsız olarak bir problemin çözümü için genel bir kalıp sunmaktadır.

Makale

Tasarım Kalıplar ve C# ta  Factory Pattern

Tasarım Kalıpları yazılım tasarımında  meydana gelen  bir birinin aynı veya  da bir birinine büyük oranda benzeyen problemleri çözmek amacıyla ortaya atılan çözüm önerileridir. İlk olarak GANG OF FOUR (GOF)* tarafından ortya atıldı.Tasarım kalıpları programlama dilinden bağımsız olarak   bir problemin çözümü için genel bir kalıp sunmaktadır.Tasarım kalıplar kendi arasında üç ana kategoriye ayrılır bunlar.

1)Creational(Oluşturuşsal) patterns : Nesnelerin örneklerinin nasıl  üretilmesi ile ilgli çözüm önerir ve  5 tane tasarım kalıbından oluşur

--Factory Method Pattern
--Abstract Factory Pattern
-- Builder Pattern
-- Prototype  Pattern
-- Singleton   Pattern

2)Structural(Yapısal) patterns :Sınıfların ve nesnelerin birleştirilerek daha büyük yazılım yapısı  kurulmasına olanak sağlayan yapılar için çözüm önerir ve 7 tane tasarım kalıbından oluşur

-- Adapter Pattern
-- Brigde Pattern
-- Composite Pattern
-- Decorator Pattern
-- Facade Pattern
-- Flyweight  Pattern
-- Proxy Pattern
 

3) Behavioral(Davranışsal) patterns:Yazılım projelerinde görevlerin nasıl dağıtılcağını ve çözümlerin nesneler  arasında naısl kullanılacağı hakkında çözüm önerir ve 10 tane tasarım kalıbından oluşur

-- Command Pattern
-- Interpreter pattern
-- Iterator pattern
-- Mediator pattern
-- Memento pattern
-- Observer pattern
-- State pattern
-- Strategy pattern
-- Template Method pattern
--Visitor pattern

       Bu tasarım kalıplarına sonradan eklemeler oldu fakat ben en temel hali ile vermek istedim 

        Biz bu makalemizde detaylı olarak Factory Method pattern  inceleyeceğiz  Factory kelimesi anlam olarak  fabrika, imalathane ,yapımevi anlamına gelir. Factory Method  nesne üretimi ile ilgili olduğundan  kategori olarak  Creational Patterns(Oluşturusal Tasarım Kalıbları) içinde yer alır.

      Factory Method tasarım kalıbı da GoF(Gangs of Four) olarak adlandırılan desenlerden olduğu için "Elements of Reusable Object-Oriented Software, AW,1995" kitabındaki tanımını temel alalım.

 

"Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses."

                Nesne yaratımı için kullanılan tek arayüz altında nesnenin nasıl yaratılacağını kalıtım yoluyla alt sınıflara bırakarak, arayüzle nesne yaratım işlevlerini birbirinden ayırır. Bu tasarım kalıbının kullanılmasındaki amaç bir nesne yaratılırken kullanıcının hangi nesneyi yaratmak zorunda olduğu bilgisine sahip olması zorunluluğunu ortadan kaldırmaktır.Örneğin bir dosya yazma uygulaması geliştiridiğimizi düşünelim bu uygulamada alınan veriler kişinin bilgisayarına yazılacaktır.Bu yazma kişinin bilgisayarında yüklü olan programa göre değişebilir eğerki kişinin bilgisayarı A formatını destekliyorsa A formatında  B formatını destekliyorsa B formatında yazılacak. Şekle Bakarsak daha net anlayabiliriz

   Şekildende anlaşılacağı gibi ürün yaratma işi Factory Methodun görevidir.Temel olarak istemciden istek gelir  ve kişin bilgisayarının desteklediği formata göre dosya üretilir.

Şimdi  bu projemizi basit bir console uygulaması ile yapalım.

interface IDosyaFormat
    {
         void metinYaz(string karakter);        
         void formatAdiYaz();
         string formatAdi    { get;   }
 
    }
 
  class AFormat : IDosyaFormat
    {
        public void formatAdiYaz()
        {
            Console.WriteLine(formatAdi);
        }
 
        public void metinYaz(string karakter)
        {
            Console.WriteLine(karakter);
        }      
        public string formatAdi
        {
            get { return "A Formatında yazılıyor"; }
        }
    }
 
class BFormat : IDosyaFormat
    {
        public void formatAdiYaz()
        {
            Console.WriteLine(formatAdi);
        }
 
        public void metinYaz(string karakter)
        {
            Console.WriteLine(karakter);
        }
    
        public string formatAdi
        {
            get { return "B Formatında yazılıyor"; }
        }
    }

 


Kaynak kodumuzdan  da görüldüğü gibi en temel yapımız IDosyaFormat arayüzüdür. Bu arayüzde bir Format ürününün adını temsil etmek için bir özellik ve dosya***ya yazmak için gereken metotlar bulunmaktadır. Bu metotların bu arayüzden türeyen bütün sınıflar tarafından uygulanması gerekmektedir. Örneğimizde bir AFormat ve BFormat Format türleri yazmak için gereken 2 adet metot ve ad bilgisini tutan bir özellik bulunmaktadır.

Şimdide DosyaFactory sınıfımıza bakalım

 

  class DosyaFactory
    {
        public DosyaFactory()
        {
 
        }
        public static IDosyaFormat dosyaGetir(string format)
        {
            IDosyaFormat dosyaFormat = null;
            if (format == "A")
            {
                dosyaFormat = new AFormat();
                return dosyaFormat;
            }
            if (format == "B")
            {
                dosyaFormat = new BFormat();
                return dosyaFormat;
            }
            return dosyaFormat;
          
              
             
        }
    }

DosyaFactory   sınıfı kendisine verilen bir format bilgisi üzerinden format nesnesini üretir.Burda işin güzel tarafı nesne üretiminin kullanıcıdan bağımsız olmasıdır. Yani eğer ki kişi bilgisayarından yeni A formatını destekleyen programı  kaldırır B formatını formatını destekleyen programı  kurarsa DosyaFactory  sınıfı ona göre nesen üretcektir.

Son olarak yukarıdaki yapıları kullanan bir istemci programı yazıp tasarım kalıbımızı  test edelim.

 

   class Test
    {
        static void Main(string[] args)
        {
            IDosyaFormat dosya = DosyaFactory.dosyaGetir("A");
            dosya.formatAdiYaz();
            //Console.ReadLine();
            string format = destekledigiFormatGetir();
            dosya = DosyaFactory.dosyaGetir(format);
            dosya.formatAdiYaz();
            dosya.metinYaz("http://www.yazgelistir.com/");
 
        }
 
        static string destekledigiFormatGetir()
        {
 
            return "";//Burda kişinin bilgi***sayarı
                      //hangi formatı destekliyorsa ona göre sonuc döner.
        }
    }

 

Son olarak tasarladığımız bütün bu sınıfları test edecek Test sınıfını inceleyelim. Bu sınıf içerisinde ürünleri üretilecek fabrikanın metotdu static olduğu için DosyaFactory nesnesi üretilmeden direk çağırıldı . Ve gelecek nesnenin tipi bilinmediği için IdosyaFormat tipinde bir nesneye atandı.

Programı çalıştırdığımızda aşağıdaki ekran görüntüsünü elde ederiz. 

 

 

Ornek Kodlar