Flyweight Pattern Nedir ve Nasıl Kullanılır?

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.

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir