Factory Method Design Pattern


Warning: count(): Parameter must be an array or an object that implements Countable in /home/kazimce1/public_html/wp-content/plugins/microkids-related-posts/microkids-related-posts.php on line 645

Factory Method tasarım deseni creational grubununa ait, aynı soyut (abstract) sınıfı veya arayüzü (interface) uygulayan sınıfların üretiminden sorumlu tasarım desenidir. Aslında, Factory Method deseni geliştirdiğiniz uygulamaya bağımlı özel sınıflar yazmanızı önleyen basit bir tasarım desenidir.

Genel olarak Factory Method tasarım deseni kullanımı 2 şekildedir.

1.Kullanım UML Diyagramı

Factory Method 1

Bu kullanım şeklinde nesne üretiminden sorumlu bir sınıf olur ve bu sınıftaki metoda gönderilen parametre ile üretilecek sınıfın türü belirlenir.

Örnek üzerinde inceleyecek olursak; çeşitli ülkelerden ürün almamız için üretici sınıflarımız olduğunu düşünelim. Bu sınıfların da IProduct arayüzünü uyguladığını varsayalım. Böylece ürün alacak sınıfın üreticileri bilmeden sadece belirli bir parametre göndererek ürün almaları sağlanabilsin.

private static void Main(string[] args)
{
    Creator c = new Creator();

    IProduct product1 = c.FactoryMethod(ProductType.Product1);
    Console.WriteLine(product1.ShipFrom());

    IProduct product2 = c.FactoryMethod(ProductType.Product2);
    Console.WriteLine(product2.ShipFrom());

    IProduct product3 = c.FactoryMethod(ProductType.Product3);
    Console.WriteLine(product3.ShipFrom());
            
    Console.ReadKey();
}

/*
Program çıktısı :

Afrika'dan gelen ürünler.
İspanya'dan gelen ürünler.
Amerika'dan gelen ürünler.
*/

private interface IProduct
{
    string ShipFrom();
}

private class Product1 : IProduct
{
    public String ShipFrom()
    {
        return "Afrika'dan gelen ürünler.";
    }
}

private class Product2 : IProduct
{
    public String ShipFrom()
    {
        return "İspanya'dan gelen ürünler.";
    }
}

private class Product3 : IProduct
{
    public String ShipFrom()
    {
        return "Amerika'dan gelen ürünler.";
    }
}

private class Creator
{
    public IProduct FactoryMethod(ProductType productType)
    {
        IProduct product = null;
        switch (productType)
        {
            case ProductType.Product1:
                product = new Product1();
                break;
            case ProductType.Product2:
                product = new Product2();
                break;
            case ProductType.Product3:
                product = new Product3();
                break;
        }
        return product;
    }
}

public enum ProductType
{
    Product1, Product2, Product3
}

2.Kullanım UML Diyagramı

Factory Method 2

İkinci kullanım şeklinde ise her nesne üretimi için aynı arayüzü kullanan sınıflar oluşturulur ve hangi sınıftan nesne istenirse ilgili sınıfı verir.

Bir önceki örneği arayüz (interface) kullanmak yerine soyut (abstract) sınıflar kullanarak gerçekleştirelim. Burada dikkat edileceği üzere ürün alacak, sınıf üreticileri ayrı ayrı oluşturulmaktadır.

private static void Main(string[] args)
{
    List<Creator> creators = new List<Creator>();
    creators.Add(new Creator1());
    creators.Add(new Creator2());
    creators.Add(new Creator3());

    foreach (Creator creator in creators)
    {
        Product product = creator.FactoryMethod();
        Console.WriteLine(product.ShipFrom());
    }

    Console.ReadKey();
}

abstract class Product
{
    public abstract string ShipFrom();

}

private class Product1 : Product
{
    public override string ShipFrom()
    {
        return "Afrika'dan gelen ürünler.";
    }
}

private class Product2 : Product
{
    public override string ShipFrom()
    {
        return "İspanya'dan gelen ürünler.";
    }
}

private class Product3 : Product
{
    public override string ShipFrom()
    {
        return "Amerika'dan gelen ürünler.";
    }
}

abstract class Creator
{
    public abstract Product FactoryMethod();
}

class Creator1 : Creator
{
    public override Product FactoryMethod()
    {
        return new Product1();
    }
}

class Creator2 : Creator
{
    public override Product FactoryMethod()
    {
        return new Product2();
    }
}

class Creator3 : Creator
{
    public override Product FactoryMethod()
    {
        return new Product3();
    }
}

Sonuç olarak Factory Method Design Pattern;

  • Esnekliğin önemli olduğu zaman,
  • Sınıfların ortak bir ataları olduğunda,
  • Paralel hiyerarşiler içinde alt sınıflar istemci için ortak delege sorumlulukları paylaştığında,
  • Ortak ataya sahip sınıflar aynı method içerisinde farklı iş gereksinimlerini karşılıyorsa,
  • tasarımınıza esneklik katıp işinizi karmaşadan kurtaracaktır.

    Eğer uygulamanızın aynı soyut (abstract) sınıfı veya arayüzü (interface) uygulayan sınıfları karmaşık operasyonlar içeriyorsa ve daha esnek nesneler üretmek istiyorsanız Abstract Factory veya Builder tasarım desenleri sizin için daha uygun olabilir.

    Kaynak;

    Creational Patterns: Prototype, Factory Method, and Singleton