Factory Method Pattern Nedir?

Can Yüksel

Erdoğancan Yüksel

2 dakika 10 saniye okuma süresi

Factory Pattern, nesne oluşturma sürecinin soyutlayıp bir merkezde toplayarak hangi sınıfın örneğinin oluşturulması gerektiğine karar veren bir sınıf tanımlanması için kullanılan yaratıcı (creational) tasarım desenlerinen birisidir. Özellikle karmaşık nesne yaratma işlemlerinin kontrol edilmesi gereken durumlarda kodun daha esnek ve sürdürülebilir olmasını sağlamaktadır.

factory-method-pattern-nedir

Factory pattern, yaratıcı (creational) tasarım desenlerinden birisidir. Nesne oluşturma işlerini bir sınıf üzerinden gerçekleştirmek ilkesine dayanmaktadır. Nesne yönelimli programlamada sıkça kullanılan bir tasarım desenidir. Bu desenin amacı bir nesneyi doğrudan oluşturmak yerine nesne oluşturma sorumluluğunu bir sınıfa devrederek kodun esnekliğini arttırmaktır. Bu şekilde istemci kodu sınıf isimlerinden bağımsız hale gelerek yeni sınıfların eklenmesi durumunda bile istemci kodu değişmeden çalışabilmektedir.

Factory pattern'ın kullanım amaçları şu şekilde sıralanabilir:

  • Nesne oluşturma işlemlerinin karmaşık duruma geldiği durumlarda kullanılabilmektedir.
  • Uygulamada dinamik bir şekilde farklı nesneler üretmek, kodun daha okunabilir ve yönetilebilir olmasını sağlamak amaçları ile kullanılabilmektedir.

Factory pattern kullanımının avantajları ve dezavantajları şu şekilde sıralanabilir:

Avantajları:
  • İstemci kodunun somut sınıf oluşturma işlemini soyutlamaktadır. İstemci kodu oluşturulan nesnenin tam sınıfını bilmek zorunda değildir, sadece hangi türde nesneye ihtiyacı olduğu belirtilmelidir.
  • İhtiyaç durumunda yeni sınıflar eklenerek kodun esnekliği korunmaktadır. SOLID prensiplerinden Açık/Kapalı Prensibi'ne (Open/Closed Principle) uymaktadır.
  • Nesne oluşturma mantığını tek bir yerde toplamaktadır. SOLID prensiplerinden Tek Sorumluluk İlkesi'ne (Single Responsibility) uymaktadır.
Dezavantajları:
  • Her bir ürün için ayrı bir sınıf gerektiğinden uygulamada çok fazla sınıf olmasına yol açabilir.
  • Küçük projelerde kullanıldığında gereksiz karışıklık yaratabilmektedir.

C# ile Factory Pattern Uygulaması

Factory Pattern uygulaması için kod örneği:

// Ödeme tipi için enum değerler atayalım
public enum PaymentType
{
    [Display(Name = "Banka Transferi")]
    BankTransfer,
    [Display(Name = "Kredi Kartı")]
    CreditCard,
    [Display(Name = "QR Kodu")]
    QRCode
}


// Ödeme yöntemleri için arayüz (Product)
public interface IPayment
{
    void MakePayment(decimal amount);

}

// Farklı ödeme yöntemlerini temsil eden Somut Ürünler (Concrete Products)
public class BankTransferPayment : IPayment
{
    public void MakePayment(decimal amount)
    {
        if (amount > 0) Console.WriteLine($"Bank transfer payment succeed! Amount: {amount}");
        else Console.WriteLine("Bank transfer payment failed. Please enter a valid amount!");
    }
}

public class CreditCardPayment : IPayment
{
    public void MakePayment(decimal amount)
    {
        if (amount > 0) Console.WriteLine($"Credit card payment succeed! Amount: {amount}");
        else Console.WriteLine("Credit card payment failed. Please enter a valid amount!");
    }
}

public class QRCodePayment : IPayment
{
    public void MakePayment(decimal amount)
    {
        if (amount > 0) Console.WriteLine($"QR code payment succeed! Amount: {amount}");
        else Console.WriteLine("QR code payment failed. Please enter a valid amount!");
    }
}

// PaymentFactory Sınıfı (Creator)
public class PaymentFactory
{
    public IPayment CreatePayment(PaymentType paymentType)
    {
        switch (paymentType)
        {
            case PaymentType.BankTransfer: return new BankTransferPayment();
            case PaymentType.CreditCard: return new CreditCardPayment();
            case PaymentType.QRCode: return new QRCodePayment();
            default: throw new ArgumentException("Invalid payment type");
        }
    }
}


// Kullanım örneği

PaymentFactory factory = new PaymentFactory();

IPayment bankPayment = factory.CreatePayment(PaymentType.BankTransfer);
bankPayment.MakePayment(1500.12m);

IPayment creditCardPayment = factory.CreatePayment(PaymentType.CreditCard);
creditCardPayment.MakePayment(1800.12m);


IPayment qrCodePayment = factory.CreatePayment(PaymentType.QRCode);
qrCodePayment.MakePayment(1100);


//# Output:
Bank transfer payment succeed! Amount: 1500,12
Credit card payment succeed! Amount: 1800,12
QR code payment succeed! Amount: 1100

 Sonuç olarak Factory Method Pattern nesne yönelimli programlama dillerinde nesne oluşturma sürecini merkezi bir yerde toplayarak kontrol altına almak ve istemci kodunu karmaşık nesne yaratma işlemlerinden soyutlamak için kullanışlı bir çözüm sunmaktadır. Özellikle yeni sınıfların eklenmesi gerektiğinde esnekliği sağlamaktadır. Bu şekilde yazılım daha modüler ve yönetilebilir olmaktadır.

Benzer İçerikler