Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Facade Tasarım Deseni - Facade Design Pattern | Proxy Tasarım Deseni - Proxy Design Pattern>>

Flyweight Tasarım Deseni - Flyweight Design Pattern

Yazar harunozer 10 December 2012

Flyweight Tasarım Deseni - Flyweight Design Pattern Flyweight tasarım deseni; structural tasarım grubuna ait, sık kullanılan nesnelerin bellek yönetimini kontrol etmek için kullanılan bir tasarım desenidir. Dofactory.com a göre kullanım sıklığı %20 civarındadır.

Flyweight tasarım deseni bir nesnenin çok kullanıldığı yapılarda kullanılarak oluşturulan nesne sayısının azaltılmasını sağlar. Oluşturulan nesne sayısı azaldığında da daha az bellek kullanımı gerçekleşir. Tabi ki bu nesnelerin bazı özellikleri birbirinden farklı, bazı özellikleri ise aynı olacaktır. Değerleri farklı olacak olan özelliklere extrinsic, aynı olan özelliklere ise intrinsic denir. Farklı olacak özelliklerin değerleri farklı olacağından client da tutulur ve flyweight uygulanacak nesneye atanması için flyweight nesnesinde bu özellikleri alacak metotlar bulunur. Flyweight tasarım desenini uml şeması üzerinden incelemeye devam edelim.

flyweight tasarım deseni uml

FlyweightFactory nesnesi içinde Flyweight listesi saklayarak Flyweight nesnesini uygulayan sınıfları saklar ve bir metot ile bu listedeki elemanlara erişim verir. Bu metot parametre olarak aldığı key değeri ile hangi ConcreteFlyweight nesnesinin istenildiğini anlar ve eğer listede bu nesne yoksa üretip bu listeye ekler ve geri döndürür. Client da ConcreteFlyweight nesnelerini diret oluşturmayıp Flyweight nesnesi üzerinden ister. Extrinsic özellikleri farklı olduğundan client bu özellikleri kendisi tutar.

Örnek bir uygulama geliştirerek Flyweight tasarım desenini daha iyi anlamaya çalışalım. Özel bir editör yapıyor olalım ve editörümüz içinde büyük boyutlarda componentler olsun. Her doküman için her komponentin bir kez oluşturulmasını istiyor olalım. Uygulamamızın class diyagramı aşağıdadır.

flyweight tasarım deseni class diyagram

Uygulamamızın kodları ve açıklamaları aşağıdadır.


//yardımcı enum
enum ComponentType
{
    Icon = 1,
    Sound = 2
}

//Flyweight
abstract class Component
{
    //intrinsic özellikler kod uzamaması için 1 tane ekledik
    public string Name;
    //extrinsic özellikler
    public int x;
    public int y;
    public abstract void Draw(int x,int y);
    public Component(string Name)
    {
        this.Name = Name;
    }
}
//ConcreteFlyweight
class ComponentIcon : Component
{
    public ComponentIcon()
        : base("CmpIcon") //sabit kısmını direkt atıyoruz
    {
    }
    public override void Draw(int x, int y)
    {
        //extrinsic özellikleri bu metot ile içeri alıp işlem yapıyoruz.
        base.x = x;
        base.y = y;
        Console.WriteLine("{0} {1} image çiziliyor.", x.ToString(), y.ToString());
    }
}
//ConcreteFlyweight
class ComponentSound : Component
{
    public ComponentSound()
        : base("CmpSound")
    {
    }
    public override void Draw(int x, int y)
    {
        base.x = x;
        base.y = y;
        Console.WriteLine("{0} {1} swf çiziliyor.", x.ToString(), y.ToString());
    }
}
//FlyweightFactory
class ComponentManager
{
    private Dictionary<ComponentType, Component> CompList;
    public ComponentManager()
    {
        CompList = new Dictionary<ComponentType, Component>();
    }
    public Component GetComponent(ComponentType ct)
    {
        //eğer listede varsa varolan nesneyi gönderiyoruz.
        if (CompList.ContainsKey(ct))
            return CompList[ct];
        //listede yoksa istenen nesneyi oluşturup listeye ekliyoruz.
        Component c;
        if (ct == ComponentType.Icon)
            c = new ComponentIcon();
        else
            c = new ComponentSound();
        CompList.Add(ct, c);
        return CompList[ct];
    }
    public int GetCount()
    {
        return CompList.Count;
    }
}
class Program
{
    static void Main(string[] args)
    {
        ComponentType[] Components = { ComponentType.Sound, ComponentType.Icon, ComponentType.Icon, ComponentType.Sound };
        ComponentManager cm = new ComponentManager();
        /*Bu değerlerin ayrı tutularak işlendiğini varsayalım*/
        int x = 20;
        int y = 10;
        foreach (ComponentType item in Components)
        {
            Component c = cm.GetComponent(item);
            c.Draw(x, y);
            x += 20;
            y += 10;
        }
        Console.WriteLine(cm.GetCount());
        Console.ReadKey();
    }
}
 
Örnek uygulamayı aşağıdaki linkten indirebilirsiniz.

FlyweightSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 3  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri