Factory Kalıbı
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 70.
Factory deseni, nesne oluşturma işlemini ayrı bir yönteme veya sınıfa devreden bir oluşturucu desendir. Kodunuzda doğrudan new kullanmak yerine, nesneleri sizin için oluşturması amacıyla bir factory’den yararlanırsınız. Bu, oluşturma mantığını merkezileştirir ve kodunuzu daha esnek hâle getirir.
Farklı türlerde belgeler oluşturmanız gereken bir senaryoyu düşünün. Bir fabrika olmadan kodunuz belirli sınıflara sıkı sıkıya bağımlı hâle gelir:
// Factory olmadan - dağınık oluşturma mantığı
IDocument doc;
if (type == "pdf")
doc = new PdfDocument();
else if (type == "word")
doc = new WordDocument();Bir fabrika bu karar verme sürecini tek bir yerde kapsüller:
public interface IDocument
{
void Open();
}
public class PdfDocument : IDocument
{
public void Open() => Console.WriteLine("Opening PDF");
}
public class WordDocument : IDocument
{
public void Open() => Console.WriteLine("Opening Word");
}
public class DocumentFactory
{
public IDocument Create(string type)
{
switch (type)
{
case "pdf":
return new PdfDocument();
case "word":
return new WordDocument();
default:
throw new ArgumentException("Unknown type");
}
}
}Artık istemci kodu somut sınıfları bilmeden yalnızca ihtiyaç duyduğu şeyi talep eder:
var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open(); // PDF açılıyorFactory kalıbı, daha sonra yeni türler eklemeniz gerektiğinde öne çıkar. Bir SpreadsheetDocument eklemek, belgelerin oluşturulduğu her yerde değil, yalnızca factory’de değişiklik yapılmasını gerektirir. Bu ayrım, kod tabanınızın bakımını ve test edilmesini kolaylaştırır.
Görev
KolayFactory desenini kullanarak bir bildirim sistemi oluşturalım. Kodunuzun çeşitli yerlerinde farklı bildirim türlerini doğrudan oluşturmak yerine, oluşturma mantığını basit bir dize tanımlayıcısına göre hangi bildirimin oluşturulacağına karar veren bir factory sınıfında merkezileştireceksiniz.
Kodunuzu üç dosyaya ayıracaksınız:
Notification.cs:Notificationsnamespace'inde, bir string döndüren tek birSend(string message)metoduna sahip birINotificationinterface'i tanımlayın. Ardından bu interface'i uygulayan üç sınıf oluşturun:EmailNotification-"Email: {message}"döndürürSmsNotification-"SMS: {message}"döndürürPushNotification-"Push: {message}"döndürür
NotificationFactory.cs: Aynı namespace içinde, tür dizesine göre uygunINotification'ı döndüren birCreate(string type)metoduna sahip birNotificationFactorysınıfı oluşturun:"email"birEmailNotificationdöndürür"sms"birSmsNotificationdöndürür"push"birPushNotificationdöndürür
EmailNotificationdöndürün.Program.cs: Bir factory örneği oluşturarak ve bunu girdiye göre bildirimler oluşturmak için kullanarak her şeyi bir araya getirin. Factory, hangi somut sınıfın örneklendirileceğine ilişkin tüm kararları yönetir.
İki girdi alacaksınız:
- Bildirim türü (örneğin,
sms) - Gönderilecek mesaj (örneğin,
Your order has shipped)
Uygun bildirim türünü oluşturmak için factory'nizi kullanın, ardından mesajla birlikte Send metodunu çağırın ve sonucu yazdırın.
Örneğin girdiler push ve Meeting in 5 minutes ise çıktı şu şekilde olmalıdır:
Push: Meeting in 5 minutesAna kodunuzun hiçbir zaman new EmailNotification() veya benzerini kullanmadığına dikkat edin - yalnızca ihtiyaç duyduğu şeyi factory'den ister. Daha sonra bir SlackNotification eklerseniz, bildirim oluşturan her yeri değil, yalnızca factory'yi güncellemeniz gerekir!
Kendin dene
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Girişi oku
string type = Console.ReadLine();
string message = Console.ReadLine();
// TODO: Bir NotificationFactory örneği oluştur
// TODO: Uygun bildirimi oluşturmak için fabrikayı kullan
// TODO: Send metodunu çağır ve sonucu yazdır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi