Design patterns notları -1- factory pattern

Bundan birkaç gün önce Wrox'un Asp.Net Design Patterns kitabını okumaya başladım. Mvc kitaplarını bitirdikten sonra, mvc'yi hatim ettim diyemesem de bir sonraki aşama olan design patterns konusuna giriş yapmak istedim. Yazılım mühendisliği alanında ilerlemek, gelişmek istiyorsanız bu konuları bilmeniz gerekiyor. Lafı fazla uzatmadan konuya gelmek istiyorum. Factory pattern, adından da anlaşılacağı üzere fabrika gibi çalışan bir sistem. Kitapta verilen örneğe benzer bir örnekle anlatmak istiyorum. Projeyi buradan indirebilirsiniz. 

Bir e-ticaret sitesi yaptığınızı düşünün, sipariş alıyorsunuz ve ve bu siparişleri kargoluyorsunuz. Çalıştığınız iki adet kargo firması olduğunu varsayalım. Bunlardan birisi kapıda ödeme hizmeti sunarken diğeri bu hizmeti sunmuyor. Müşterinizin verdiği siparişteki ödeme şekline göre (kapıda ödeme ve diğerleri(kredi kartı, havale vs.)) siteniz otomatik olarak kargo firması ve kargo takip kodu atayacak. Yani bir kargo fabrikanız olacak ve isteğe göre kargo firması oluşturacak. Şimdi kodları yazarsak daha kolay anlayacaksınız.

İlk önce Siparis sınıfımızı oluştuyoruz.

public class Siparis
{
    public int SiparisId { getset; }
    public int MusteriId { getset; }
    public int SehirId { getset; }
    public decimal Fiyat { getset; }
    public bool KapidaOdeme { getset; }
    public string Adres { getset; }
}

 

Sipariş Sınıfından sonra kargor firmaları için bir interface yazıyoruz. Bu interface'e göre iki farklı kargo firması tanımlayacağız. TakipKoduOlusutur metodu ile, siparişin kargo firmasının internet sitesi üzerinden takibini yapmak için kullandığımız kodu oluşturuyoruz. Bu kod sipariş bilgilerimizi alıp kendi içindeki bir algoritmayla kod üretiyor.

public interface IKargo
{
    string TakipKoduOlustur(Siparis Siparis);
}

 

Kapıda ödemeli kargo firmasını IKargo interface'ini inherit ederek yazıyoruz.

public class KapidaOdemeliKargo : IKargo
{
    public string TakipKoduOlustur(Siparis Siparis)
    {
        return "Kapıda ödeme kargo firması için takip kodu";
        // Burada aslında Siparis.SehirId gibi değerleri kullanarak iparişe özel bir kod üretiyoruz
    }
}

 

Kapıda ödemesi olmayan kargo firması

public class NormalKargo : IKargo
{
    public string TakipKoduOlustur(Siparis Siparis)
    {
        return "Normal kargo firması için takip kodu";
    }
}

 

Buraya kadar olanlar gayet açık. Bir sipariş sınıfımız var, bir Kargo interface'i ve bunu inherit eden 2 adet farklı kargor firması var. Her bir kargo firması, siparişe göre, kendine özgü takip kodu üretiyor. Şimdi de siparişi verdikten sonra kargo firmasını belirleyecek/atayacak olan KargoFabrikasını yazacağız.

public class KargoFabrikası
{
    public IKargo KargoFirmasiUret(Siparis Siparis) // Ödeme şekline göre bir kargo firması döndürüyor
    {
        if (Siparis.KapidaOdeme) // Kapıda ödeme seçilmiş ise 
        {
            return new KapidaOdemeliKargo();
        }
 
        else
        {
            return new NormalKargo();
        }
    }
}

 

Yazdığımız bu kargo fabrikasını uygulamamızda aşağıdaki gibi test edebiliriz

    class Program
    {
        static void Main(string[] args)
        {
            Siparis siparis = new Siparis
            {
                SiparisId = 1,
                MusteriId = 1,
                SehirId = 34,
                Fiyat = 12,
                Adres = "Adres"
            };
 
            IKargo kargo = KargoFabrikası.KargoFirmasiUret(siparis);
            string kargoTakipKodu = kargo.TakipKoduOlustur(siparis);
        }    }

 

Gördüğünüz gibi Main metodumuz, kargor firması belirleme işine hiç karışmıyor. Bu işi yapan KargoFabrikası sınıfı oluyor. Not: Örnek projedeki diğer tasarım yanlışlıklarına takılmayın. Projenin en az kod ile örneklenmesi için bu şekilde yapmam gerekiyordu.

 Projeyi buradan indirebilirsiniz.

Leave a Reply

Your email address will not be published. Required fields are marked *