C# Factory Design Pattern (Fabrika Tasarım Deseni)

Engin Karabudak
XTribe
Published in
3 min readAug 29, 2020

Merhabalar, yazılarıma kısa bir aranın ardından bir design pattern (tasarım desenleri) olan Factory Design Pattern ile bir dönüş yapıyorum.

Design Pattern Nedir ?

Yazılım mühendisliğinde design patternler, geçmişten günümüze yazılım geliştirme süreçlerinde sık karşılaşılan problemleri ya da karmaşıklığı gidermek adına sorunlara genel, tekrarlanabilir oluşturulan çözüm şablonlarına denir. Bu şablonlar, OOP yaklaşımı ile geliştirilen projelerde ,program dili bağımsız sınıf ve nesneler arasındaki ilişkilerin en iyi şekilde nasıl olmaları gerektiğini açıklayan yöntemlerdir. Zamanla uygulanan bu çözümler bir tasarım kalıbı halini almıştır.

Tarihçe

Design Patterns kavramı 1994 yılında Design Patterns — Elements of Reusable Object-Oriented Software adlı kitapta ortaya atılmıştır. Kitabın yazarları günümüzde Gang of Four (GOF) olarakta bilinen Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides dir. Bu kitapta 3 farklı kategoride toplam 23 adet tasarım deseni anlatılmaktadır.

Bu 3 ana kategori; Creational, Structural, Behavioral dır.

Şimdi de creational (oluşturucu) tasarım desenlerinden Factory Patterni nasıl oluyor bakalım.

Factory Pattern
Factory tasarım deseni,creational tasarım desenlerinden biridir. Bu tasarım deseni bir nesne yaratmak için arayüz sağlar ve hangi sınıftan nesne yaratılacağını alt sınıfların belirlemesine olanak tanır. Asıl amaç oluşturmak istediğimiz sınıfların tek tek instance oluşturmak yerine bu oluşturma işlemini tek bir sınıf üzerinden yönetmek. Örnek verecek olursak; Kodumuz içersindeki bir metotda, belirli caselerde farklı tiplerde nesnelere ihtiyacımız olabilir. Bu nesneleri tabiki de if-else ya da switch-case yapıları kullanarakta oluşturabiliriz, yalnız nesnelerimiz arttıkça bunu her seferinde if-else ya da switch-case bloklarına eklememiz hem zaman, hem bakım, hemde kod uzaması ve modülerlik açısından hiç hoş bir durum olmayacaktır. İşte böyle durumlarda Factory Method paternini kullanabiliriz. Factory Patterni uygulamak için “abstract class” ya da “interface” yapılarından faydalanabiliriz. Bu yapılar sayesinde soyutlama(Abstraction) yapabiliyoruz soyut sınıfı miras alan sınıf ata sınıfın tüm metotlarını override etmek zorunda oluyor böylecede kod tekrarını engellemiş oluyoruz. Her miras aldığımız sınıfta, soyut sınıfların özellikleri kullanılarak nesnelerin ihtiyaçlarına göre farklı sonuçlar üretebiliyoruz(polymorphism(çok biçimlilik)).

Faktory patternin yaptığı işi, yukarıdaki resimde basitçe açıklamak gerekirse Client nesnemiz, ihtiyacı olan Product nesnesini Factory nesnesini kullanarak ihtiyacını elde eder. Yani bu şekilde Client’ın istediği nesneyi Factory aracılığı ile oluşturduğundan dolayı nesne yaratma sürecinden soyutlanmış olur ve bu sayede sadece kendi işlevlerine odaklanmış olur.

Şimd Abstract Sınıflarla Factory Design Pattern’i Uygulayalım

Şimdi geliştireceğimiz örnekle Factory Patterni daha iyi anlamış olacağız. Basit bir senaryo kurgulayalım Bir sürücü kursu olduğunu düşünelim ve bu kurstan A sınıfı, B sınıfı ve E sınıfı ehliyet alabiliyorsunuz sınıfların her birinin farklı türde araç sürebilme izni var. Senaryomuz bu şekilde şimdi ise kodlamaya geçelim.

abstract class Ehliyet{
public abstract void Sür();
}

Ehliyetlerini türeteceğimiz abstract sınıfı yazdık şimdi de ürünlerimizi yani ehliyet sınıflarımızı türetelim.

public class ASınıfı: Ehliyet{
public override void Sür(){
Console.WriteLine("Bu ehliyet sınıfında motorsiklet kullanabilirsiniz.");
}
}
public class BSınıfı: Ehliyet{
public override void Sür(){
Console.WriteLine("Bu ehliyet sınıfında otomobil kullanabilirsiniz.");
}
}
public class ESınıfı: Ehliyet{
public override void Sür(){
Console.WriteLine("Bu ehliyet sınıfında otobüs kullanabilirsiniz.");
}
}

Yukarıda ehliyet türü sınıflarını oluşturduk artık bu sınıflardan nesne üretecek olan Creater sınıfını oluşturalım ve içerisine Factory işlemini yapacak metodumuzu tanımlayalım.

enum Tipler{
ASınıfı,
BSınıfı,
ESınıfı
}
public class Creater{ public Ehliyet FactoryMethod(Tipler ehliyetTipi){

Ehliyet ehliyet= null;
switch (ehliyetTipi){case Tipler.ASınıfı:ehliyet= new ASınıfı(); break;case Tipler.BSınıfı:ehliyet= new BSınıfı(); break;case Tipler.ESınıfı:ehliyet= new ESınıfı(); break;
}
return ehliyet;
}
}

Yukarıda fabrika metodumuzu oluşturduk verdiğimiz tipe göre istenilen ehliyet tipi sınıfını oluşturacak.

class Program{static void Main(string[] args){Creater creater = new Creater();Ehliyet ehliyetSınıfı = creater.FactoryMethod(Tipler.ASınıfı);ehliyetSınıfı.Sür();
}
}

Factory Pattern kısaca böyledir. Interface kullanarakta yukarıda ki şablonu tasarlayabiliriz. Umarım faydalı bir yazı olmuştur.

--

--