Giriş
Uygulamanız birden fazla nesne türü üretiyorsa, doğrudan new anahtar kelimesiyle yönetmek kod karmaşasına yol açar. İşte bu noktada Factory Pattern, nesne yaratma sorumluluğunu merkezi bir sınıfa devrederek loosely-coupled, test edilebilir bir yapı sunar.
Bu yazıda:
- Factory Pattern nedir?
- Kurulum ve temel örnek
- Katmanlı mimaride nerede kullanılır?
- Gelişmiş senaryolar (Parametre ile seçim, Reflection vs.)
- Avantaj & Dezavantajlar

1. Factory Pattern Temel Kavramları
- Creator (Factory): Nesne oluşturma mantığını barındırır.
- Product (Interface/Abstract): Ortak arayüz veya soyut sınıf.
- ConcreteProduct:
Product’ın farklı implementasyonları. - Client: Sadece
FactoryüzerindenProductalır, doğrudannewçağırmaz.
2. Kurulum ve Basit Örnek
Product Arayüzü
public interface IShape
{
void Draw();
}
ConcreteProduct’lar
public class Circle : IShape
{
public void Draw() => Console.WriteLine("Circle çizildi.");
}
public class Square : IShape
{
public void Draw() => Console.WriteLine("Square çizildi.");
}
ShapeFactory
public static class ShapeFactory
{
public static IShape Create(string type)
{
return type.ToLower() switch
{
"circle" => new Circle(),
"square" => new Square(),
_ => throw new ArgumentException("Geçersiz tip.")
};
}
}
Client Kullanımı
var shape1 = ShapeFactory.Create("circle");
shape1.Draw(); // Circle çizildi.
var shape2 = ShapeFactory.Create("square");
shape2.Draw(); // Square çizildi.
Factory sayesinde new Circle() veya new Square() çağrısı Client’ta hiç görünmez.
3. Katmanlı Mimaride Kullanımı
| Katman | Factory Rolü |
|---|---|
| Application | Create(...) metodu burada yer alır |
| Domain | IShape ve Circle, Square sınıfları |
| API | Controller’ın, ShapeFactory’ı çağırması |
4. Gelişmiş Senaryolar
Parametreli Factory
public static IShape Create(ShapeType type)
{
return type switch
{
ShapeType.Circle => new Circle(),
ShapeType.Square => new Square(),
_ => throw new ArgumentOutOfRangeException()
};
}
Reflection Tabanlı Factory
public static IShape Create<T>() where T : IShape, new()
=> new T();
Configurable Factory
var map = new Dictionary<string, Type>
{
["circle"] = typeof(Circle),
["square"] = typeof(Square)
};
public static IShape Create(string key)
{
var type = map[key];
return (IShape)Activator.CreateInstance(type);
}
5. Avantajlar & Dezavantajlar
Avantajlar
- Loose Coupling: Client, somut sınıflardan ayrı kalır.
- Tek Sorumluluk: Factory tek bir yerde nesne yaratmayı yönetir.
- Test Edilebilirlik: Mock Factory ile test kolaylaşır.
Dezavantajlar
- Ekstra Kod: Basit senaryolarda gereksiz katman oluşturabilir.
- Bakım Maliyeti: Çok sayıda ConcreteProduct olduğunda Factory karmaşıklaşır.
İleri Okuma ve Kaynaklar
- Refactoring Guru: Factory Pattern
- Factory Method vs Abstract Factory
- Design Patterns in C# – Factory Method and Abstract Factory
6. Sonuç
- Factory Pattern, oluşturma sorumluluğunu soyutlar ve Client kodunu sadeleştirir.
- Katmanlı mimarilerde merkezi bir nokta sayesinde bakım ve genişletme kolaylaşır.
- Gelişmiş senaryolarda Reflection veya config tabanlı yaklaşımlar tercih edilebilir.