Flyweight Pattern, bellek kullanımını optimize etmek için kullanılır. Bu desen, aynı nesnelerin birden fazla kopyasını oluşturmak yerine, bu nesneleri paylaşarak bellek tasarrufu sağlar. Özellikle çok sayıda küçük nesnenin gerektiği durumlarda bu desen oldukça etkilidir.
İçerik
Flyweight Pattern Nedir?
Flyweight Pattern, Structural (Yapısal) Tasarım Desenleri kategorisine girer. Bu desen, bir nesnenin içsel (intrinsic) ve dışsal (extrinsic) durumlarını ayırarak çalışır. İçsel durumlar, nesnenin değişmeyen, paylaşılan durumlarını ifade ederken, dışsal durumlar, nesnenin bağlama göre değişen durumlarını temsil eder.
Nasıl Çalışır?
Flyweight Pattern’de, ortak durumlar merkezi bir yerde tutulur ve gerektiğinde paylaşılır. Bu sayede, her bir nesne için ayrı ayrı bellek tahsisi yapılmaz, yerine ortak bir bellek alanı kullanılır. Bu yaklaşım, özellikle bellek yönetimi konusunda önemli avantajlar sağlar.
Flyweight Pattern – Kod Örneği
Aşağıda Flyweight Pattern’in basit bir Java implementasyonunu görebilirsiniz. Bu örnekte, bir Shape
arayüzü ve bu arayüzü implement eden Circle
sınıfı bulunmaktadır. ShapeFactory
sınıfı, nesneleri gerektiğinde oluşturarak ya da önceden oluşturulmuş nesneleri geri döndürerek Flyweight Pattern’in temel işlevini gerçekleştirir.
import java.util.HashMap;
interface Shape {
void draw();
}
class Circle implements Shape {
private String color;
private int x;
private int y;
private int radius;
public Circle(String color) {
this.color = color;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Circle: Draw() [Color : " + color + ", x : " + x + ", y :" + y + ", radius :" + radius);
}
}
class ShapeFactory {
private static final HashMap<String, Shape> circleMap = new HashMap<>();
public static Shape getCircle(String color) {
Circle circle = (Circle) circleMap.get(color);
if (circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("Creating circle of color : " + color);
}
return circle;
}
}
public class FlyweightPatternDemo {
private static final String[] colors = {"Red", "Green", "Blue", "White", "Black"};
public static void main(String[] args) {
for (int i = 0; i < 20; ++i) {
Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
circle.setX(getRandomX());
circle.setY(getRandomY());
circle.setRadius(100);
circle.draw();
}
}
private static String getRandomColor() {
return colors[(int) (Math.random() * colors.length)];
}
private static int getRandomX() {
return (int) (Math.random() * 100);
}
private static int getRandomY() {
return (int) (Math.random() * 100);
}
}
Uygulama Açıklaması
Bu örnekte, ShapeFactory
sınıfı renk bazında Circle
nesneleri oluşturur. Aynı renkteki daireler yeniden oluşturulmaz, bunun yerine mevcut nesne geri döndürülür. Bu sayede bellek kullanımında büyük tasarruf sağlanır. main
metodunda, 20 adet Circle
nesnesi oluşturulur ve çizdirilir, ancak gerçekten oluşturulan nesne sayısı renk sayısıyla sınırlıdır.
Sonuç
Flyweight Pattern, özellikle çok sayıda nesnenin gerektiği durumlarda bellek kullanımını optimize etmek için etkilidir. Bu desen, nesnelerin ortak durumlarını paylaşarak bellek tasarrufu sağlar ve uygulamanın performansını artırır. Dahası, Java’da Flyweight Pattern’i kullanarak daha verimli ve ölçeklenebilir uygulamalar geliştirebilirsiniz.