Factory Method 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 Factory Method Tasarım Deseni’ni anlatacağım. Hadi başlayalım !
Table of Contents
Aslında diğer tüm tasarım desenlerinde olduğu gibi Factory Method Tasarım Deseni de C# diline özgü bir kavram değil. Daha temiz ve anlaşılır kod yazabilmek için bir kesim tarafından belirlenmiş ve yazılım çevresinde kabul görmüş yazılı olmayan kurallardan birisidir. Dolayısıyla sadece C# dilinde değil, diğer tüm nesne yönelimli programlama yapılabilen dillerde de uygulanabilmektedir. Ben bu tasarım deseninin mantığını anlatabilmek ve örnek kodlar verebilmek için C# üzerinden anlattım fakat siz mantığını anladıktan sonra diğer dillerde de uyarlayabilirsiniz.
Factory Method tasarım deseni, creational tasarım desenlerinden biridir. Bu desen, nesne yaratma işlemini alt sınıflara devreder ve bu sayede uygulamada sınıflar arasındaki bağımlılıkları azaltır. Bu makalede, Factory Method tasarım desenini C# kod örnekleri ile birlikte inceleyeceğiz.
Factory Method Tasarım Deseni
Factory Method tasarım deseni, bir üst sınıfta tanımlanmış bir arayüz veya soyut sınıf üzerinden alt sınıfların nesne yaratmasını sağlar. Bu sayede, nesne yaratma işlemi alt sınıflara devredilerek kodun daha esnek hale getirilmesi ve sınıflar arasındaki bağımlılıkların azaltılması hedeflenir.
Bu tasarım deseni, genellikle fabrika (factory) sınıfları kullanılarak uygulanır. Fabrika sınıfları, belirli bir amaç doğrultusunda nesne yaratmak için kullanılır ve Factory Method tasarım deseni ile birlikte kullanıldığında, nesne yaratma işlemi tamamen bu sınıflara devredilir.
Factory Method Tasarım Deseni Örnekleri
Aşağıda, Factory Method tasarım deseni örnekleri yer almaktadır:
Örnek 1: Araç Fabrikası
Araç fabrikası örneği, Factory Method tasarım deseninin temel prensiplerini açıklamak için kullanılabilir. Bu örnekte, bir araba üreticisi farklı araç türleri üretmek isteyebilir. Örneğin, bir SUV, bir sedan veya bir spor araba üretebilir.
// Araç arayüzü
public interface IArac
{
string Model { get; }
string Renk { get; }
}
// Araç fabrikası arayüzü
public interface IAracFabrikasi
{
IArac AracUret();
}
// SUV araç sınıfı
public class SUV : IArac
{
public string Model => "SUV";
public string Renk => "Beyaz";
}
// Sedan araç sınıfı
public class Sedan : IArac
{
public string Model => "Sedan";
public string Renk => "Siyah";
}
// Spor araç sınıfı
public class Spor : IArac
{
public string Model => "Spor";
public string Renk => "Kırmızı";
}
// SUV araç fabrikası
public class SUVAracFabrikasi : IAracFabrikasi
{
public IArac AracUret()
{
return new SUV();
}
}
// Sedan araç fabrikası
public class SedanAracFabrikasi : IAracFabrikasi
{
public IArac AracUret()
{
return new Sedan();
}
}
// Spor araç fabrikası
public class SporAracFabrikasi : IAracFabrikasi
{
public IArac AracUret()
{
return new Spor();
}
}
// Kullanım Örneği
public class ArabaUretim
{
private readonly IAracFabrikası _aracFabrikasi;
public ArabaUretim(IAracFabrikasi aracFabrikasi)
{
_aracFabrikasi = aracFabrikasi;
}
public void ArabaUret()
{
var arac = _aracFabrikasi.AracUret();
Console.WriteLine($"Yeni araç üretildi: {arac.Model}, {arac.Renk}");
}
}
// Kullanım
var suvAracFabrikasi = new SUVAracFabrikasi();
var sedanAracFabrikasi = new SedanAracFabrikasi();
var sporAracFabrikasi = new SporAracFabrikasi();
var arabaUretim1 = new ArabaUretim(suvAracFabrikasi);
arabaUretim1.ArabaUret();
var arabaUretim2 = new ArabaUretim(sedanAracFabrikasi);
arabaUretim2.ArabaUret();
var arabaUretim3 = new ArabaUretim(sporAracFabrikasi);
arabaUretim3.ArabaUret();
Kod Açıklamaları
Yukarıdaki örnekte, IArac arayüzü, araç sınıflarında ortak özellikleri tanımlamak için kullanılır. IAracFabrikasi arayüzü, araç fabrikalarında ortak olan nesne yaratma işlemini tanımlamak için kullanılır.
SUV, Sedan ve Spor araç sınıfları, IArac arayüzünden türetilir ve kendi özelliklerine sahiptir. SUVAracFabrikasi, SedanAracFabrikasi ve SporAracFabrikasi sınıfları ise IAracFabrikasi arayüzünden türetilir ve kendi nesne yaratma yöntemlerine sahiptir.
ArabaUretim sınıfı, IAracFabrikasi arayüzünden türetilir ve AracUret() yöntemini kullanarak yeni araçlar üretir. Kullanım örneğinde, farklı araç fabrikaları kullanılarak yeni araçlar üretilir.
Örnek 2: Uygulama Ayarları Fabrikası
Bir uygulama, çeşitli ayarlar ve yapılandırmalar içerebilir. Bu örnekte, farklı ayarlar için ayrı fabrika sınıfları kullanarak uygulama ayarları oluşturacağız.
public interface IUygulamaAyarları
{
string SunucuAdi { get; }
int Port { get; }
string VeritabaniAdi { get; }
}
// Uygulama ayarları fabrikası arayüzü
public interface IUygulamaAyarlarıFabrikasi
{
IUygulamaAyarları UygulamaAyarlarıOlustur();
}
// Geliştirme ortamı ayar
public class GelistirmeOrtamiAyar : IUygulamaAyarları
{
public string SunucuAdi => "localhost";
public int Port => 8080;
public string VeritabaniAdi => "test";
}
// Test ortamı ayarı
public class TestOrtamiAyar : IUygulamaAyarları
{
public string SunucuAdi => "localhost";
public int Port => 9090;
public string VeritabaniAdi => "test";
}
// Üretim ortamı ayarı
public class UretimOrtamiAyar : IUygulamaAyarları
{
public string SunucuAdi => "production.example.com";
public int Port => 80;
public string VeritabaniAdi => "production";
}
// Geliştirme ortamı ayarları fabrikası
public class GelistirmeOrtamiAyarFabrikasi : IUygulamaAyarlarıFabrikasi
{
public IUygulamaAyarları UygulamaAyarlarıOlustur()
{
return new GelistirmeOrtamiAyar();
}
}
// Test ortamı ayarları fabrikası
public class TestOrtamiAyarFabrikasi : IUygulamaAyarlarıFabrikasi
{
public IUygulamaAyarları UygulamaAyarlarıOlustur()
{
return new TestOrtamiAyar();
}
}
// Üretim ortamı ayarları fabrikası
public class UretimOrtamiAyarFabrikasi : IUygulamaAyarlarıFabrikasi
{
public IUygulamaAyarları UygulamaAyarlarıOlustur()
{
return new UretimOrtamiAyar();
}
}
// Kullanım örneği
public class Uygulama
{
private readonly IUygulamaAyarlarıFabrikasi _ayarFabrikasi;
public Uygulama(IUygulamaAyarlarıFabrikasi ayarFabrikasi)
{
_ayarFabrikasi = ayarFabrikasi;
}
public void AyarlariYukle()
{
var ayarlar = _ayarFabrikasi.UygulamaAyarlarıOlustur();
Console.WriteLine($"Ayarlar yüklendi: {ayarlar.SunucuAdi}, {ayarlar.Port}, {ayarlar.VeritabaniAdi}");
}
}
// Kullanım
var gelistirmeOrtamiAyarFabrikasi = new GelistirmeOrtamiAyarFabrikasi();
var testOrtamiAyarFabrikasi = new TestOrtamiAyarFabrikasi();
var uretimOrtamiAyarFabrikasi = new UretimOrtamiAyarFabrikasi();
var uygulama1 = new Uygulama(gelistirmeOrtamiAyarFabrikasi);
uygulama1.AyarlariYukle();
var uygulama2 = new Uygulama(testOrtamiAyarFabrikasi);
uygulama2.AyarlariYukle();
var uygulama3 = new Uygulama(uretimOrtamiAyarFabrikasi);
uygulama3.AyarlariYukle();
Kod Açıklamaları
Yukarıdaki örnekte, IUygulamaAyar interface’i, farklı ortamlar için ayarları tanımlayan üç sınıf tarafından uygulanır. Bu sınıflar, GelistirmeOrtamiAyar, TestOrtamiAyar ve UretimOrtamiAyar sınıflarıdır.
Ayrıca IUygulamaAyarlarıFabrikasi adlı bir fabrika arayüzü tanımlanır. Bu arayüz, farklı ortamlar için ayarları oluşturmak için kullanılacaktır.
Her bir farklı ortam için IUygulamaAyarlarıFabrikasi arayüzünden türetilen bir fabrika sınıfı oluşturulur. Bu fabrika sınıfları, her bir farklı ortam için uygun IUygulamaAyarları nesnesini oluşturmak için kullanılır.
Son olarak, Uygulama sınıfı, IUygulamaAyarlarıFabrikasi arayüzünden türetilen bir fabrika nesnesi kullanarak ayarları yükler.
Yukarıdaki kod örneği, Geliştirme, Test ve Üretim ortamları için ayrı ayrı ayarları tanımlayarak, her bir ortam için uygun olan ayarları yüklemeyi sağlar. Ayrıca, kodun yeniden kullanımını arttırır ve daha sürdürülebilir bir çözüm sunar.
Sonuç
Sonuç olarak, Factory Method tasarım deseni, bir arayüz üzerinden soyutlandığı için, uygulamanın farklı parçalarını birbirinden bağımsız hale getirir ve gelecekteki değişikliklere uyum sağlamayı kolaylaştırır.
Evet Factory Method tasarım deseni ve C# ile uygulanması bu şekilde yapılmakta. 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.