C#'ta Flyweight Design Pattern

C#'ta Flyweight Design Pattern kullanımını görelim.

Flyweight Design Pattern

Structural Patterns gurubu içerisinde yer alır. Bellek tüketimini optimize ederek belleği gereksiz işlemlerden arındırp daha verimli kullanmak için tasarlanmış bir tasarım desenidir. Nesnelerin bellek tüketimleri nesne sayısı ile doğru ortantılı olarak artmaktadır. FlyWeight tasarım deseni yapıca aynı nesneleri bellekte çokca oluşturmak yerine her bir nesnenin bir kopyasını oluşturmak ve oluşturulan nesneleri ortak bir noktada tutup paylaştırma işlemini yerine getirir.

  • Flyweight: Nesnenin ortak özelliklerini tutan interface veya abstract class.
  • ConcreteFlyweight: Flyweight şablonunu uygulayan farklı Nesneler (örneğimizdeki her bir harf)
  • FlyweightFactory: Nesneleri ortak bir noktada tutan ve paylaşımını sağlayan yapı.
  • Client: İstemci uygulama

İncelediğim neredeyse tüm kaynaklarda Flyweight pattern kullanımı konusunda kelime işlemci uygulamaları örneği verilmiş. Bir yazıda geçen harfler bir nesne olarak temsil edilmiş ve bellekte her harf basımında yeni nesne üretmek yerine her harf için bellekte bir nesne üretmek ve yeniden talep halinde ortak noktadan çağırıp kullanmak örneklendirilmiş.

Örneğin 5000 satırılık sadece harften oluşan bir yazı için bellekte 5000 nesne üretmek yerine alfabeyi temsilen 29 nesne tutulmuş. Her bir nesne bellekte 1 byte kaplayacağı varsayılırsa 5000 byte'lık bellek tüketimi 29 byte'a düşürülmüş hafifletilmiş oluyor.

namespace ConsoleApplicaiton1

{

class Program

{

static void Main()

{

string document = "AAZZBBZB";

char[] chars = document.ToCharArray(); CharacterFactory factory = new CharacterFactory();

// extrinsic state int pointSize = 10;


// For each character use a flyweight object foreach (char c in chars)

{

pointSize++;

Character character = factory.GetCharacter(c); character.Display(pointSize);

}


Console.ReadKey();

}

}


//FlyweightFactory class class CharacterFactory

{

private Dictionary<char, Character> _characters = new Dictionary<char, Character>();


public Character GetCharacter(char key)

{

Character character = null;

if (_characters.ContainsKey(key))

{



}

else

{

character = _characters[key];



switch (key)

{


case 'A': character = new CharacterA(); break;

case 'B': character = new CharacterB(); break;

//...

case 'Z': character = new CharacterZ(); break;

}

_characters.Add(key, character);

}

return character;

}

}


//Flyweight

abstract class Character

{

protected char symbol; protected int width; protected int height; protected int ascent; protected int descent; protected int pointSize;

public abstract void Display(int pointSize);

}



// ConcreteFlyweight

class CharacterA : Character

{

// Constructor public CharacterA()

{

this.symbol = 'A'; this.height = 100;

this.width = 120;

this.ascent = 70;

this.descent = 0;

}


public override void Display(int pointSize)

{

this.pointSize = pointSize; Console.WriteLine(this.symbol +

" (pointsize " + this.pointSize + ")");

}

}


//ConcreteFlyweight

class CharacterB : Character

{

public CharacterB()

{

this.symbol = 'B'; this.height = 100;

this.width = 140;

this.ascent = 72;

this.descent = 0;

}


public override void Display(int pointSize)

{

this.pointSize = pointSize; Console.WriteLine(this.symbol +

" (pointsize " + this.pointSize + ")");

}

}


//ConcreteFlyweight

class CharacterZ : Character

{

public CharacterZ()

{

this.symbol = 'Z'; this.height = 100;

this.width = 100;

this.ascent = 68;

this.descent = 0;

}


public override void Display(int pointSize)

{

this.pointSize = pointSize; Console.WriteLine(this.symbol +

" (pointsize " + this.pointSize + ")");

}

}

}

Ekran Çıktısı:

  • A (pointsize 11)
  • A (pointsize 12)
  • Z (pointsize 13)
  • Z (pointsize 14)
  • B (pointsize 15)
  • B (pointsize 16)
  • Z (pointsize 17)
  • B (pointsize 18)

Her bir harfi temsilen ConcreteFlyweight yapıları oluşturulmuş ve bu yapılar Flyweight abstract class'ını uygulamış ve bu sayede ortak nesne yapısı sağlamışlardır. FlyweightFactory yapısı Flyweight arayüzünü uygulayan nesneleri tutan ve paylaştıran bir yapıda çalışmaktadır. Eğer nesne daha önce üretildi ise üretilen nesneyi, eğer üretilmedi ise yeni ürettiği nesneyi dönmektedir.

Extrinsic state nesnelerin harici durumudur. Örnekte her bir karakterin Point Size değeri farklıdır. Ya da konumları farklı olabilir. Örneğin 3.satır 5.sütun gibi..

Ozan Dalbudak
Merhaba,1995 doğumluyum. 2009 yılında lisede veritabanı Programcılığı bölümünü kazanarak kariyerime başlamış oldum. Daha sonra Selçuk Üniversitesi'nde Bilgisayar Mühendisliği okuyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git