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şturma işlemini ayrı bir metoda veya sınıfa devreden bir oluşturucu (creational) desendir. Kodunuzda doğrudan new kullanmak yerine, sizin için nesneler oluşturmasını bir fabrikadan istersiniz. Bu, oluşturma mantığını merkezileştirir ve kodunuzu daha esnek hale getirir.

Farklı türde belgeler oluşturmanız gereken bir senaryoyu düşünün. Bir fabrika (factory) olmadan, kodunuz belirli sınıflara sıkı sıkıya bağlı hale 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 sadece neye ihtiyacı olduğunu talep eder:

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

Factory deseni, daha sonra yeni türler eklemeniz gerektiğinde parlar. 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ı yapmayı ve test etmeyi kolaylaştırır.

challenge icon

Görev

Kolay

Fabrika (Factory) desenini kullanarak bir bildirim sistemi oluşturalım. Kodunuzun her yerinde doğrudan farklı bildirim türleri oluşturmak yerine, hangi bildirimin oluşturulacağına basit bir dize tanımlayıcısına göre karar veren bir fabrika sınıfında oluşturma mantığını merkezileştireceksiniz.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Notification.cs: Notifications ad alanı (namespace) içinde, dize döndüren tek bir Send(string message) metoduna sahip bir INotification arayüzü tanımlayın. Ardından bu arayüzü 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 INotification nesnesini döndüren bir Create(string type) metoduna sahip bir NotificationFactory 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ımlanamayan 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 girdilere dayalı bildirimler oluşturmak için kullanarak her şeyi bir araya getirin. Fabrika, hangi somut sınıfın örnekleneceğine dair tüm karar verme sürecini 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 fabrikanızı 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 minutes

Ana kodunuzun hiçbir zaman new EmailNotification() veya benzerini kullanmadığına dikkat edin - sadece fabrikadan neye ihtiyacı olduğunu ister. Daha sonra bir SlackNotification eklerseniz, bildirimlerin oluşturulduğu her yeri değil, yalnızca fabrikayı güncellemeniz gerekecektir!

Kopya kağıdı

Factory deseni, nesne oluşturma işlemini ayrı bir metoda veya sınıfa devreden, oluşturma mantığını merkezileştiren ve kodu daha esnek hale getiren bir kurucu (creational) desendir.

Bir factory (fabrika) olmadan, nesne oluşturma işlemi dağınıktır ve sıkı sıkıya bağlıdır (tightly coupled):

// 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 ile oluşturma mantığı tek bir yerde kapsüllenir (encapsulated):

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")
        };
    }
}

İstemci kodu, somut sınıfları bilmeden nesne talep eder:

var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open();  // Opening PDF

Factory deseni yeni türler eklemeyi kolaylaştırır; değişiklikler kod tabanına yayılmak yerine factory içinde izole edilir.

Kendin dene

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // Girdiyi oku
        string type = Console.ReadLine();
        string message = Console.ReadLine();

        // TODO: Bir NotificationFactory örneği oluşturun

        // TODO: Uygun bildirimi oluşturmak için fabrikayı kullanın

        // TODO: Send metodunu çağırın ve sonucu yazdırın
    }
}
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