Factory Pattern ile Nesne Üretimi: Kodunuzu Daha Esnek Hale Getirin!
Merhaba sevgili yazılımcı dostlarım! Bugün sizlere tasarım kalıplarının (Design Patterns) en sevilenlerinden biri olan Factory Pattern ‘den bahsedeceğim. Factory Pattern nedir, ne zaman hayat kurtarır ve C# ile nasıl uygulanır, gelin birlikte inceleyelim. Hazırsanız, kod dünyasına dalış yapıyoruz!
Factory Pattern Nedir?
Factory Pattern, bir sınıfın nesne oluşturma sorumluluğunu başka bir sınıfa devrettiği bir tasarım kalıbıdır. Yani, istemci (client) hangi nesnenin oluşturulacağını bilmek zorunda kalmaz, sadece “fabrika”ya (factory) hangi türde bir nesne istediğini söyler ve fabrika da o nesneyi oluşturup istemciye verir.
Bu tanım biraz karmaşık gelmiş olabilir, değil mi? Basitleştirelim: Diyelim ki bir oyuncak fabrikası var. Siz fabrikaya “Bana bir oyuncak araba yap” diyorsunuz. Fabrika da sizin için bir oyuncak araba üretiyor. İşte Factory Pattern de tam olarak bu mantıkla çalışır.
Ne Zaman Factory Pattern Kullanmalıyız?
Peki, Factory Pattern’i ne zaman kullanmalıyız? İşte size birkaç senaryo:
* Nesne oluşturma süreci karmaşıksa: Eğer bir nesnenin oluşturulması için birden fazla adım gerekiyorsa veya farklı parametreler alması gerekiyorsa, Factory Pattern bu karmaşıklığı gizleyebilir.
* Nesne türü çalışma zamanında (runtime) belirleniyorsa: Uygulamanızın çalışma zamanında hangi türde nesneye ihtiyacı olduğunu belirlemesi gerekiyorsa, Factory Pattern size esneklik sağlar.
* Gevşek bağlantı (loose coupling) isteniyorsa: Factory Pattern, istemci ile somut sınıflar arasındaki bağımlılığı azaltır, böylece uygulamanız daha esnek ve bakımı daha kolay hale gelir.
* Tek sorumluluk prensibi (Single Responsibility Principle) ihlal ediliyorsa: Bir sınıfın hem iş mantığını yürütmesi hem de nesne oluşturma sorumluluğunu taşıması tek sorumluluk prensibine aykırıdır. Factory Pattern ile nesne oluşturma sorumluluğunu ayrı bir sınıfa devrederek bu prensibi koruyabilirsiniz.
C# ile Örnek Uygulama
Teori kısmı tamam, şimdi de C# ile basit bir örnek yapalım. Diyelim ki farklı türlerde log üreten bir uygulamamız var: Dosyaya log yazan, konsola log yazan ve veritabanına log yazan.
Öncelikle bir `ILogger` arayüzü tanımlayalım:
“`csharp
public interface ILogger
{
void Log(string message);
}
“`
Şimdi de bu arayüzü uygulayan somut sınıfları oluşturalım:
“`csharp
public class FileLogger : ILogger
{
private string _filePath;
public FileLogger(string filePath)
{
_filePath = filePath;
}
public void Log(string message)
{
File.AppendAllText(_filePath, message + Environment.NewLine);
}
}
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
public class DatabaseLogger : ILogger
{
private string _connectionString;
public DatabaseLogger(string connectionString)
{
_connectionString = connectionString;
}
public void Log(string message)
{
// Veritabanına log yazma işlemleri burada gerçekleştirilir.
Console.WriteLine($”Veritabanına log yazıldı: {message}”);
}
}
“`
Şimdi de `ILogger` nesnelerini oluşturacak olan Factory sınıfımızı oluşturalım:
“`csharp
public class LoggerFactory
{
public ILogger CreateLogger(string loggerType, string parameter = null)
{
switch (loggerType.ToLower())
{
case “file”:
if (string.IsNullOrEmpty(parameter))
{
throw new ArgumentException(“Dosya yolu belirtilmelidir.”);
}
return new FileLogger(parameter);
case “console”:
return new ConsoleLogger();
case “database”:
if (string.IsNullOrEmpty(parameter))
{
throw new ArgumentException(“Veritabanı bağlantı dizesi belirtilmelidir.”);
}
return new DatabaseLogger(parameter);
default:
throw new ArgumentException(“Geçersiz logger tipi.”);
}
}
}
“`
Ve son olarak, istemci kodumuz:
“`csharp
public class Client
{
public void DoSomething()
{
LoggerFactory factory = new LoggerFactory();
// Dosyaya log yazmak için
ILogger fileLogger = factory.CreateLogger(“file”, “app.log”);
fileLogger.Log(“Bu bir dosya log mesajıdır.”);
// Konsola log yazmak için
ILogger consoleLogger = factory.CreateLogger(“console”);
consoleLogger.Log(“Bu bir konsol log mesajıdır.”);
// Veritabanına log yazmak için
ILogger databaseLogger = factory.CreateLogger(“database”, “Data Source=localhost;Initial Catalog=LogDB;Integrated Security=True”);
databaseLogger.Log(“Bu bir veritabanı log mesajıdır.”);
}
}
“`
Bu örnekte, `Client` sınıfı hangi türde logger nesnesi oluşturacağını bilmek zorunda değil. Sadece `LoggerFactory` sınıfının `CreateLogger` metoduna istediği logger tipini belirtiyor ve fabrika da ona uygun nesneyi oluşturup veriyor.
Factory Pattern, nesne oluşturma sürecini soyutlayarak kodunuzu daha esnek, okunabilir ve bakımı kolay hale getiren güçlü bir tasarım kalıbıdır. Umarım bu makale, Factory Pattern’i anlamanıza ve uygulamanıza yardımcı olmuştur.
Unutmayın, tasarım kalıpları her derde deva değildir. Her zaman ihtiyacınıza en uygun olanı seçmeli ve uygulamanızın karmaşıklığını artırmaktan kaçınmalısınız.
Kodla kalın, sağlıcakla kalın! 😊