Menu
Coddy logo textTech

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şturmayı ayrı bir method'a veya class'a devreden bir oluşturma desenidir. Kodunuzda doğrudan new kullanmak yerine, sizin için nesneler oluşturması amacıyla bir factory'den istersiniz. Bu, oluşturma logic'ini merkezileştirir ve kodunuzu daha esnek hâle getirir.

Farklı türlerde belgeler create etmeniz gereken bir senaryo düşünün. Bir factory olmadan kodunuz belirli sınıflara sıkı şekilde bağlı 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 factory 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)
    {
        return type switch
        {
            "pdf" => new PdfDocument(),
            "word" => new WordDocument(),
            _ => throw new ArgumentException("Unknown type")
        };
    }
}

Artık istemci kodu, somut sınıfları bilmeden yalnızca ihtiyaç duyduğu şeyi ister:

var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open();  // PDF açılıyor

Fabrika deseni, daha sonra yeni türler eklemeniz gerektiğinde öne çıkar. Bir SpreadsheetDocument eklemek, belgelerin oluşturulduğu her yerde değil, yalnızca fabrikada 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.

challenge icon

Görev

Kolay

Factory desenini kullanarak bir bildirim sistemi oluşturalım. Kodunuzun çeşitli yerlerinde farklı bildirim türlerini doğrudan oluşturmak yerine, oluşturma logic'ini hangi bildirimin oluşturulacağına basit bir dize tanımlayıcıya göre karar veren bir factory class içinde merkezileştireceksiniz.

Kodunuzu üç dosya arasında düzenleyeceksiniz:

  • Notification.cs: Notifications namespace'i içinde, string döndüren tek bir Send(string message) method'una sahip bir INotification interface'i Define edin. Ardından bu interface'i Implement eden üç class oluşturun:
    • EmailNotification - "Email: {message}" returns
    • SmsNotification - "SMS: {message}" returns
    • PushNotification - "Push: {message}" returns
  • NotificationFactory.cs: Aynı namespace içinde bir NotificationFactory class'ı oluşturun. Bu class, type dizesine based olarak appropriate INotification döndüren bir Create(string type) method'una sahip olmalıdır:
    • "email" bir EmailNotification returns
    • "sms" bir SmsNotification returns
    • "push" bir PushNotification returns
    Tanınmayan herhangi bir type için default olarak bir EmailNotification return edin.
  • Program.cs: Bir factory instance'ı oluşturup input based bildirimler oluşturarak her şeyi bir araya getirin. Factory, hangi somut class'ın oluşturulacağıyla ilgili tüm karar verme logic'ini yönetir.

İki input alacaksınız:

  • Bildirim type'ı (örneğin, sms)
  • Gönderilecek message (örneğin, Your order has shipped)

appropriate bildirim type'ını oluşturmak için factory'nizi kullanın, ardından message ile Send method'unu Call edin ve result'ı print edin.

Örneğin input'lar push ve Meeting in 5 minutes ise output şöyle olmalıdır:

Push: Meeting in 5 minutes

Main kodunuzun hiçbir zaman new EmailNotification() veya benzerini kullanmadığına dikkat edin - yalnızca factory'den ihtiyaç duyduğu şeyi 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 factory'yi kullan

        // TODO: Send metodunu çağır ve sonucu yazdır
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C# derleyicisi