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 pattern, nesne oluşturmayı ayrı bir metoda veya sınıfa devreden bir yaratıcı tasarım desenidir. Kodunuzda doğrudan new kullanmak yerine, sizin için nesneler oluşturması amacıyla bir fabrikadan yardım istersiniz. Bu, oluşturma mantığını merkezileştirir ve kodunuzu daha esnek hâle getirir.

Farklı türlerde belgeler oluşturmanız gereken bir senaryo düşünün. Bir fabrika olmadan kodunuz belirli sınıflara sıkı sıkıya 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 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)
    {
        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

Fabrika 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 fabrika sınıfında merkezileştireceksiniz.

Kodunuzu üç dosya üzerinden düzenleyeceksiniz:

  • Notification.cs: INotification ad alanında, bir dize döndüren tek bir Notifications yöntemine sahip bir Send(string message) arabirimi tanımlayın. Ardından bu arabirimi uygulayan üç sınıf oluşturun:
    • EmailNotification - "Email: {message}" döndürür
    • SmsNotification - "SMS: {message}" döndürür
    • PushNotification - "Push: {message}" döndürür
  • NotificationFactory.cs: Aynı ad alanında, tür dizesine göre uygun NotificationFactory'ı döndüren bir Create(string type) yöntemine sahip bir INotification sınıfı oluşturun:
    • "email" bir EmailNotification döndürür
    • "sms" bir SmsNotification döndürür
    • "push" bir PushNotification döndürür
    Tanınmayan herhangi bir tür için varsayılan olarak bir EmailNotification döndürün.
  • Program.cs: Bir fabrika örneği oluşturarak ve bunu girdiye göre bildirimler oluşturmak için kullanarak her şeyi bir araya getirin. Fabrika, 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 ileti (örneğin, Your order has shipped)

Uygun bildirim türünü oluşturmak için fabrikanızı kullanın, ardından iletiyle birlikte Send yöntemini çağırın ve sonucu yazdırın.

Örneğin, girdiler push ve Meeting in 5 minutes ise çıktı şöyle olmalıdır:

Push: Meeting in 5 minutes

Ana kodunuzun hiçbir zaman new EmailNotification() veya benzerini kullanmadığına dikkat edin - yalnızca fabrikadan ihtiyacı olanı ister. Daha sonra bir SlackNotification eklerseniz, bildirim oluşturan her yeri değil, yalnızca fabrikayı 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