Flyweight Tasarım Deseni

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda tasarım desenlerinden biri olan flyweight tasarım desenini anlatacağım. Hadi başlayalım !
Table of Contents
Aslında diğer tüm tasarım desenlerinde olduğu gibi Flyweight Tasarım Deseni de C# diline özgü bir kavram değil. Daha temiz ve anlaşılır kod yazabilmek için bir kesim tarafından belirlenmiş ve yazılım çevresinde kabul görmüş yazılı olmayan kurallardan birisidir. Dolayısıyla sadece C# dilinde değil, diğer tüm nesne yönelimli programlama yapılabilen dillerde de uygulanabilmektedir. Ben bu tasarım deseninin mantığını anlatabilmek ve örnek kodlar verebilmek için C# üzerinden anlattım fakat siz mantığını anladıktan sonra diğer dillerde de uyarlayabilirsiniz.
Flyweight Tasarım Deseni Nedir?
Flyweight tasarım deseni, bellek yönetimi için kullanılan bir tasarım desenidir. Bu desen, nesne yaratma işleminin gereksiz yere tekrarlanmasını önleyerek bellek kullanımını optimize eder. Flyweight tasarım deseni, birçok küçük nesneyi paylaşılan bir havuzda saklayarak, daha az bellek kullanılmasını sağlar.
C# İle Uygulanması
Aşağıdaki örnekte, bir dizi şekil nesnesi oluşturulacak ve bu nesneler çizildiğinde bellek kullanımının azaltılması sağlanacaktır. Bu örnekte, bir şekil sınıfı (Shape) oluşturulacak ve bu sınıfı kalıtım yoluyla farklı şekil tipleri (Circle, Square) için genişletilecektir. Ayrıca, bu örnekte ShapeFactory adında bir sınıf oluşturulacak ve bu sınıfın amacı, şekilleri oluşturmak ve bellek kullanımını minimize etmek olacaktır.
// Şekil sınıfı
public abstract class Shape
{
public abstract void Draw();
}
// Daire sınıfı
public class Circle : Shape
{
private string _color;
public Circle(string color)
{
this._color = color;
}
public override void Draw()
{
Console.WriteLine("Circle drawn with color : " + _color);
}
}
// Kare sınıfı
public class Square : Shape
{
private string _color;
public Square(string color)
{
this._color = color;
}
public override void Draw()
{
Console.WriteLine("Square drawn with color : " + _color);
}
}
// Şekil fabrikası sınıfı
public class ShapeFactory
{
private static Dictionary<string, Shape> _shapes = new Dictionary<string, Shape>();
public static Shape GetShape(string color, string shapeType)
{
Shape shape = null;
if (_shapes.ContainsKey(shapeType))
{
shape = _shapes[shapeType];
}
else
{
if (shapeType.Equals("Circle"))
{
shape = new Circle(color);
}
else if (shapeType.Equals("Square"))
{
shape = new Square(color);
}
_shapes.Add(shapeType, shape);
}
return shape;
}
}
// Kullanım örneği
public static void Main(string[] args)
{
Shape shape1 = ShapeFactory.GetShape("Red", "Circle");
shape1.Draw();
Shape shape2 = ShapeFactory.GetShape("Green", "Square");
shape2.Draw();
Shape shape3 = ShapeFactory.GetShape("Blue", "Circle");
shape3.Draw();
Shape shape4 = ShapeFactory.GetShape("Yellow", "Square");
shape4.Draw();
}
Kod Açıklamaları
Yukarıdaki kod örneği, şekil nesnelerinin oluşturulması ve bellek kullanımının azaltılması için Flyweight tasarım desenini kullanır. ShapeFactory sınıfı, örnekleri yaratmadan önce bellekte zaten varsa örneklerin yeniden kullanılmasını sağlar. Bu, özellikle büyük sayıda şekilleri yaratmak için kullanıldığında bellek kullanımında büyük bir azalma sağlar.
Örneğin, yukarıdaki kodda ShapeFactory sınıfı, oluşturulan nesneleri bir sözlükte saklar. Yeni bir şekil istendiğinde, ShapeFactory önce sözlüğü kontrol eder ve şeklin daha önce yaratılmış olup olmadığını kontrol eder. Şekil daha önce yaratılmışsa, ShapeFactory nesnesini geri döndürür. Eğer şekil daha önce yaratılmamışsa, ShapeFactory yeni bir şekil yaratır, sözlüğe ekler ve nesneyi geri döndürür.
Bu örnekte, şekil nesneleri Circle ve Square sınıflarında oluşturulur ve her bir şekil bir renk parametresi alır. Circle ve Square sınıfları, Shape sınıfından kalıtım alır ve Draw() metodunu uygular. ShapeFactory sınıfı, Circle ve Square sınıflarından türetilmiş şekil nesneleri yaratır.
Main() metodunda, ShapeFactory sınıfı kullanılarak birkaç şekil nesnesi yaratılır ve çizdirilir. Bellek kullanımının azaltılması için, aynı şekillerin birden fazla kez oluşturulması engellenir ve önceden yaratılan şekiller tekrar kullanılır.
Sonuç
Bu örnekte, Flyweight tasarım deseninin nasıl kullanılabileceğini gösterdik. Bu desen, bellek kullanımını minimize etmek için kullanılabilir ve büyük boyutlu uygulamalar veya nesne yaratımı yoğun uygulamalar için oldukça yararlıdır.
Evet flyweight tasarım deseni tanımı ve C# ile kullanımı bu şekilde yapılmakta. Tüm C# yazılarımıza buraya, diğer tasarım deseni yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.