Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Interface Extension Method ve Generic Factory Pattern Örneği.

Aşağıda işime yarayan bir kod örneğini paylaşmak istedim.Öncelikle Extension metodlar nedir kısaca ondan bahsedeyim.Net’in varolan sınıflarına yeni bir method eklemek için kullanılan genişletilebilen metodlardır. Örneğin :

string s = "Extension Deneme";
 s.ToLower();
<pre>

Bu örnekte .NET tarafında tanımlı bir extension metodu kullandık. İşte biz de bu şekilde metodlar .net tiplerine veya kendi oluşturduğumuz sınıf tiplerine uygulayabiliriz. Bu kod örneğimizde bir interface ve ondan türeyecek sınıflar için bir extension metod yapacağız . Ayrıca ekstra olarak da Generic Factory Pattern’ini kullanarak sınıfın create edilmesini sağlayacağız. Yani bir örnekte 2 kuş birden.

Generic Factory Pattern de Generic yapıları kullanarak nesnelerin run time da oluşturulmasını sağlayan bir tasarım desenidir. Nesneler recflection yöntemi ile create edilir.


/// <summary>
/// Generic Factory Pattern
/// Software classes, modules, functions etc. should be open for extension, but closed for modification
/// </summary>
public class Factory<T>
{
    private readonly Dictionary<string, Type> _factoryDictionary = new Dictionary<string, Type>();

    public Factory()
    {
        //Assembly içinde T tipinden bulunan bütün sınıflar bulunuyor ve dictionary'e ekleniyor.
        Type[] types = Assembly.GetAssembly(typeof(T)).GetTypes();
        foreach (Type type in types)
        {
            if (!typeof(T).IsAssignableFrom(type) || type == typeof(T))
            {
                continue;
            }
            _factoryDictionary.Add(type.Name, type);
        }
    }

    public T Create<V>(params object[] args)
    {
        return (T)Activator.CreateInstance(_factoryDictionary[typeof(V).Name], args);
    }
}

public static class ExtensionMethods
{
    public static decimal TotalPrices(this IEnumerable<IProduct> productEnum)
    {
        decimal total = 0;
        foreach (IProduct prod in productEnum)
        {
            total += prod.ListPrice;
        }
        return total;
    }
}

public class ShoppingChart : IEnumerable<IProduct>
{
    public List<IProduct> Products { get; set; }

    public IEnumerator<IProduct> GetEnumerator()
    {
        return Products.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

class Program
{
        static void Main(string[] args)
        {
            Factory<IProduct> factory = new Factory<IProduct>();
            factory.Create<Product>(null);
        }
}

October 8, 2012 - Posted by | C#, Yazılım, İpucu | , , , ,

2 Comments »

  1. Benim ödevi yapmışsın. :) Daha derin inceleyecem müsait bir zamanda.

    Comment by semihkirdinli | October 22, 2012 | Reply

  2. İyi anlamadığın yer olursa anlatırım sana :)

    Comment by koraykirdinli | October 22, 2012 | Reply


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s