Factory
Factory deseniyle nesne oluşturma yöntemini öğrenirsin.
Factory deseni
Factory, nesne yaratma mantığını tek bir yerde toplar. İstemci hangi somut sınıfın üretileceğini bilmez; yalnızca bir arayüz (INotifier) üzerinden çalışır. Fabrika metodu bir parametreye bakarak doğru somut türü seçer ve döndürür.
Avantaj: yeni bir bildirim kanalı eklemek için yalnızca fabrikayı değiştirirsin; istemci kodu aynı kalır. Bu, açık-kapalı ilkesine (open-closed) uygundur: genişletmeye açık, değiştirmeye kapalı.
Fabrika metodu
Bir fabrika metodu, genellikle static olarak tanımlanır ve parametre olarak bir tür adı alır. Gövdede switch ifadesi doğru somut sınıfı seçer. Dönüş türü arayüzdür, bu yüzden istemci yalnızca INotifier görür.
Örnek: static INotifier Create(string type) => type switch { "sms" => new SmsNotifier(), "email" => new EmailNotifier(), _ => null };. Burada _ varsayılan durumu (default) yakalar.
Uygulama NotifierFactory oluştur
interface INotifier tanımla; string Send(string message) metodu olsun. SmsNotifier ve EmailNotifier sınıfları bu arayüzü uygulayıp "SMS: " + message ve "Email: " + message döndürsün. static class NotifierFactory içinde static INotifier Create(string type) metodu type parametresine göre doğru türü döndürsün ("sms" ve "email"). Main'de Create("sms") ile bir bildirici al ve Send("Merhaba") sonucunu yazdır.
Örnek çözümü göster
interface INotifier { string Send(string message); } tanımla. SmsNotifier ve EmailNotifier bu arayüzü uygulayan sınıflar olsun. static class NotifierFactory { public static INotifier Create(string type) => type switch { "sms" => new SmsNotifier(), "email" => new EmailNotifier(), _ => null }; } yaz. Main'de Console.WriteLine(NotifierFactory.Create("sms").Send("Merhaba"));
Örnek çözüm:
using System;
interface INotifier
{
string Send(string message);
}
class SmsNotifier : INotifier
{
public string Send(string message) => "SMS: " + message;
}
class EmailNotifier : INotifier
{
public string Send(string message) => "Email: " + message;
}
static class NotifierFactory
{
public static INotifier Create(string type) =>
type switch
{
"sms" => new SmsNotifier(),
"email" => new EmailNotifier(),
_ => null
};
}
class Program
{
static void Main()
{
Console.WriteLine(NotifierFactory.Create("sms").Send("Merhaba"));
}
}
Kendini test et
-
Factory deseninin çözdiği sorun nedir?
- Nesne yaratma kodunu gizler
- Çalışma anında doğru somut türü seçer
- Statik metodları zorunlu kılar
- Arayüzleri kaldırır
Cevabı göster
Çalışma anında doğru somut türü seçer — Doğru. Factory bir parametreye bakarak doğru somut türü seçer.
-
Somut sınıf örneği oluştur
return ____ SmsNotifier();Cevabı göster
return new SmsNotifier(); -
Factory terimlerini eşleştir
- Creator
- Fabrika metodunu barındıran sınıf
- Product
- Üretilen nesnenin arayüzü
- ConcreteProduct
- Somut ürün sınıfı
- Client
- Fabrikayı çağıran kod