Abstract Factory Tasarım Deseni

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda tasarım desenlerinden biri olan Abstract Factory tasarım desenini anlatacağım. Hadi başlayalım !
Table of Contents
Aslında bu tasarım deseni diğer tüm tasarım desenlerinde de olduğu gibi C# diline özgü bir kavram değil, tüm nesne yönelimli programlama dillerinde daha temiz kod yazabilmek için oluşturulmuş ve yazılımcılar tarafından da kabul görmüş yazılı olmayan kurallardır ve nesne yönelimli programlama yapılabilen tüm dillerde uygulanabilmektedir.
Abstract Factory Tasarım Deseni Nedir?
Abstract Factory tasarım deseni, nesne yaratma işlemini bir arayüz vasıtasıyla soyutlar ve farklı nesne ailelerinin oluşturulmasına izin verir. Bu tasarım deseni, bir uygulama içinde birden fazla farklı türde nesnenin kullanılması gerektiği durumlarda kullanışlıdır.
C# programlama dili, Abstract Factory tasarım desenini uygulamak için oldukça uygun bir dilidir. Aşağıda, C# dilinde Abstract Factory tasarım deseni kullanarak bir örnek senaryo ve kod örnekleri sunulmaktadır.
Örnek Senaryo:
Bir restoran uygulaması tasarlanması gerekiyor. Bu uygulama, farklı restoranlar için menü öğeleri, içecekler ve tatlılar oluşturabileceği bir menü oluşturucusu içermelidir. Örneğin, bir fast food restoranı için hamburger, patates kızartması ve gazlı içecek, bir İtalyan restoranı için pizza, spagetti ve şarap, bir Türk restoranı için kebab, pilav ve ayran gibi seçenekler olmalıdır.
Abstract Factory tasarım desenini kullanarak, her restoran türü için ayrı bir menü oluşturucu fabrikası oluşturabiliriz. Bu fabrikalar, menü öğeleri, içecekler ve tatlılar oluşturmak için kullanılabilir.
C# İle Uygulanması
Aşağıda, C# dilinde bu senaryo için bir Abstract Factory tasarım deseni uygulaması verilmiştir:
// Menü öğeleri
interface IMenüOgesi {
string isim { get; }
string tür { get; }
}
class Hamburger : IMenüOgesi {
public string isim { get { return "Hamburger"; } }
public string tür { get { return "Fast food"; } }
}
class Pizza : IMenüOgesi {
public string isim { get { return "Pizza"; } }
public string tür { get { return "İtalyan"; } }
}
class Kebab : IMenüOgesi {
public string isim { get { return "Kebab"; } }
public string tür { get { return "Türk"; } }
}
// İçecekler
interface IIcecek {
string isim { get; }
string tür { get; }
}
class GazliIcecek : IIcecek {
public string isim { get { return "Gazlı İçecek"; } }
public string tür { get { return "Fast food"; } }
}
class Sarap : IIcecek {
public string isim { get { return "Şarap"; } }
public string tür { get { return "İtalyan"; } }
}
class Ayran : IIcecek {
public string isim { get { return "Ayran"; } }
public string tür { get { return "Türk"; } }
}
// Tatlılar
interface ITatli {
string isim { get; }
string tür { get { return "Fast food"; } }
}
class Tiramisu : ITatli {
public string isim { get { return "Tiramisu"; } }
public string tür { get { return "İtalyan"; } }
}
class Baklava : ITatli {
public string isim { get { return "Baklava"; } }
public string tür { get { return "Türk"; } }
}
// Fabrikalar
interface IMenuFabrikasi {
IMenüOgesi MenüOgesiOlustur();
IIcecek IcecekOlustur();
ITatli TatliOlustur();
}
class FastFoodMenuFabrikasi : IMenuFabrikasi {
public IMenüOgesi MenüOgesiOlustur() {
return new Hamburger();
}
public IIcecek IcecekOlustur() {
return new GazliIcecek();
}
public ITatli TatliOlustur() {
return new ÇikolatalıKek();
}
}
class İtalyanMenuFabrikasi : IMenuFabrikasi {
public IMenüOgesi MenüOgesiOlustur() {
return new Pizza();
}
public IIcecek IcecekOlustur() {
return new Şarap();
}
public ITatli TatliOlustur() {
return new Tiramisu();
}
}
class TürkMenuFabrikasi : IMenuFabrikasi {
public IMenüOgesi MenüOgesiOlustur() {
return new Kebab();
}
public IIcecek IcecekOlustur() {
return new Ayran();
}
public ITatli TatliOlustur() {
return new Baklava();
}
}
// Ana sınıf
class Restoran
{
private IMenüOgesi menüOgesi;
private IIcecek icecek;
private ITatli tatli;
public Restoran(IMenuFabrikasi fabrika) {
menüOgesi = fabrika.MenüOgesiOlustur();
icecek = fabrika.IcecekOlustur();
tatli = fabrika.TatliOlustur();
}
public void MenüGöster() {
Console.WriteLine("Menü Öğesi: " + menüOgesi.isim + " (" + menüOgesi.tür + ")");
Console.WriteLine("İçecek: " + icecek.isim + " (" + icecek.tür + ")");
Console.WriteLine("Tatlı: " + tatli.isim + " (" + tatli.tür + ")");
}
}
// Kullanımı
class Program
{
static void Main(string[] args)
{
IMenuFabrikasi fastfoodFabrikasi = new FastFoodMenuFabrikasi();
Restoran fastfoodRestoranı = new Restoran(fastfoodFabrikasi);
fastfoodRestoranı.MenüGöster();
IMenuFabrikasi italyanFabrikasi = new İtalyanMenuFabrikasi();
Restoran italyanRestoranı = new Restoran(italyanFabrikasi);
italyanRestoranı.MenüGöster();
IMenuFabrikasi türkFabrikasi = new TürkMenuFabrikasi();
Restoran türkRestoranı = new Restoran(türkFabrikasi);
türkRestoranı.MenüGöster();
Console.ReadKey();
}
}
Kod Açıklamaları
Bu örnekte, Restoran sınıfı, menü öğesi, içecek ve tatlı olmak üzere üç farklı nesne türü oluşturur. Restoran sınıfının yapıcı metoduna, hangi türde bir menü oluşturulacağına karar vermek için bir IMenuFabrikasi nesnesi verilir.
IMenuFabrikasi arayüzü, MenüOgesiOlustur(), IcecekOlustur() ve TatliOlustur() metodlarına sahiptir ve bu metodlar, farklı menü öğeleri, içecekler ve tatlılar üretmek için farklı sınıflar tarafından uygulanır.
Örneğin, FastFoodMenuFabrikasi sınıfı, Hamburger, GazlıIcecek ve ÇikolatalıKek nesnelerini üretirken, İtalyanMenuFabrikasi sınıfı, Pizza, Şarap ve Tiramisu nesnelerini üretir.
Restoran sınıfı, oluşturulan menü öğesi, içecek ve tatlı nesnelerini saklar ve MenüGöster() metodunu kullanarak tüm menüyü konsola yazdırır.
Ana program, farklı menü türleri için Restoran sınıfının nasıl kullanılacağını göstermektedir. Bu örnek, Abstract Factory deseninin, farklı nesne türlerinin oluşturulması ve bu nesnelerin birbirleriyle uyumlu olması için kullanıldığını göstermektedir.
Umarım bu örnek, Abstract Factory deseninin nasıl kullanılacağına dair bir fikir vermiştir ve size yardımcı olmuştur.
Evet Abstract Factory tasarım deseni ve C# ile uygulanması bu şekilde olmakta. Tüm C# yazılarımıza buraya, diğer tasarım desenleri ile ilgili yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.