Creational Patterns (Yaratıcı Tasarım Desenleri) grubu altında yeralan Builder tasarım deseni istemci tarafından talep edilen nesnelere ait daha önceden belirli kurallar çerçevesinde hazırlanmış olan içeriklerin, otomatik olarak cevap vermesini sağlamaktadır.
Bunun en önemli nedenlerinden birisi talep edilen nesnenin farklı içeriklerde çeşitlerine ihtiyaç duyulmasıdır. Bu durumu şu şekildeki bir senaryo ile daha kolay kavrayabiliriz.
Fastfood ürün satışı yapılan bir işletmede aşağıdaki şekilde 3 adet menünün bulunduğunu düşünelim.
1. Menü : Kaşarlı Tost Menüsü
• Kaşarlı Tost
• 4 Adet Yeşil Zeytin
• 3 Adet Salatalık Dilimi
• 2 Adet Domates Dilimi
• Kola
2. Menü : Sucuklu Tost Menüsü
• Sucuklu Tost
• 4 Adet Siyah Zeytin
• 1 Adet Beyaz Peynir Dilimi
• Ayran
3. Menü : Soğuk Sandviç Menüsü
• Soğuk Sandviç
• 4 Adet Salatalık Turşusu
• 2 Adet Biber
• Çay
Bu işletmeye gittiğimizde menü seçimi sonrası yemeklerin hazırlanması işleminde standartlar dahilinde içeriğin ne olduğunu belirtmeyiz değil mi?
Yemekler hazırlanır ve önümüze gelir. Bizim bu aşamada yapmış olduğumuz işlem ise sadece bize sunulmasını istediğimiz menüye ait seçimin yapılmasıdır.
İşte Builder Tasarım Deseni de tam olarak bu işlemi gerçekleştirir. Biz sadece bize sunulmasını istediğimiz nesneyi seçeriz ve nesne arka planda hazırlanmış olan içeriklerinin işlenmiş hali ile bizlere sunulur.
Şimdi belirtmiş olduğumuz işletmemize ait işleyişi Builder Tasarım Deseni ile tasarlayalım.
İlk yapmamız gereken işlemimiz tüm menülerimizde bulunan ve Yemek – Garnitür –İçecek olarak gruplandıracağımız taban bilgileri tanımlamak.
public class Menu { public string Yemek { get; set; } public string Garnitur { get; set; } public string Icecek { get; set; } public override string ToString() { return String.Format("{0}\r\n{1}\r\n{2}", Yemek, Garnitur, Icecek); } } |
Taban bilgilerimizden farklı olarak tanımlama yapmış olduğumuz Classımızda ToString() metodunu override ile ezmiş olmamızın sebebi menümüze ait içeriğin ToString() metodunu kullanacağımız sipariş oluşturma aşamasında ekrana gelmesini sağlamaktır.
Taban bilgilerimizi tanımladıktan sonra Menulerimizin hazırlanması ile ilgili işlemleri belirleyen sınıfımızı her menünün içeriği farklı olması nedeniyle abstract olarak hazırlayalım
public abstract class MenuHazirla { protected Menu _Menu; public Menu Menu { get { return _Menu; } } public abstract void GarniturEkle(); public abstract void IcecekEkle(); } |
Bu sınıfımızdaki protected olarak tanımlanmış olan _Menu nesnesi Menulerimiz altından bir önceki sınıf içeriğinde belirttiğimiz ToString() metodumuza erişmek için gereklidir. Ancak dışarıdan erişimi sadece okunabilir tipte olmasını istediğimizden dolayı protected olarak tanımlanmış ve yardımcı nesne olarak sadece okunabilir (read-only) property olarak Menu propertisi tanımlanmıştır.
Menulerimize ait hazırlanma aşamalarını da tanımladığımıza göre artık Menulerimizi ve içeriklerini belirlediğimiz sınıflarımızı tanımlayabiliriz.
public class Menu1 : MenuHazirla { public Menu1() { _Menu = new Menu { Yemek = "Kaşarlı Tost" }; } public override void GarniturEkle() { _Menu.Garnitur = "4 adet Yeşil Zeytin - 3 adet Salatalık dilimi- 2 adet Domates dilimi"; } public override void IcecekEkle() { _Menu.Icecek = "Kola"; } } public class Menu2 : MenuHazirla { public Menu2() { _Menu = new Menu { Yemek = "Sucuklu Tost" }; } public override void GarniturEkle() { _Menu.Garnitur = "4 adet Siyah Zeytin - 1 Adet Beyaz Peynir dilim"; } public override void IcecekEkle() { _Menu.Icecek = "Ayran"; } } public class Menu3 : MenuHazirla { public Menu3() { _Menu = new Menu { Yemek = "Soğuk Sandviç" }; } public override void GarniturEkle() { _Menu.Garnitur = "4 adet Salatalık Turşusu - 2 Adet Biber"; } public override void IcecekEkle() { _Menu.Icecek = "Çay"; } } |
Menülerimizi de oluşturduktan sonra sıra sipariş alındığında alınan siparişin hazırlanmasına geldi.
public class Siparis { public void SiparisOlustur(MenuHazirla SecilenMenu) { SecilenMenu.GarniturEkle(); SecilenMenu.IcecekEkle(); Console.WriteLine(SecilenMenu.Menu.ToString()); } } |
Siparişin hazırlanması aşamasında hazırlanmış olan siparişin sunumunu da classımıza üstlendirmiş olduk
Console.WriteLine(SecilenMenu.Menu.ToString()); |
Dilenirse bu işleme sipariş alma aşamasından sonra da (nesne talebi yapıldıktan sonra) ulaşabiliriz.
Artık müşterilerimizden (İstemciden) siparişimizi alabiliriz.
Siparis sp=new Siparis(); sp.SiparisOlustur(new Menu2()); |
Gördüğünüz gibi sipariş aşamasında sadece yeni bir sipariş oluşturularak sipariş edilecek menü seçiminden başka bir şey yapılmamaktadır.
Şipariş verildikten (İstemci tarafından nesne talebinden) sonra ise sonuç karşımıza hazırlamış olduğumuz Menü içeriği olarak gelmektedir.
Hazırladığımız menülerimize yenilerini ekleme işleminde İstemci tarafındaki kodda hiçbir değişiklik yapmamıza gerek yoktur. Tek yapmamız gereken Yeni eklediğimiz Menünün de içeriğinin Yemek – Garnitür ve İçecek şeklinde gruplandırılmış yapıda olmasına dikkat etmektir.
Bu makalede kullanılan tasarım desenine ait kodu indirmek için ………..
Teşekkürler Hocam.