Object Pool – Tasarım Kalıpları

Merhabalar, bu yazımda Object Pool (Nesne Havuzu) tasarım kalıbından bahsedeceğim. Evet, Java’da nasıl nesne yaratılır biliyoruz, hatta bi önceki yazımda eğer nesneyi oluşturmak çok maliyetli ise Prototype tasarım kalıbını kullanmıştık. Object Pool tasarım kalıbı da isminden de anlaşıldığı gibi, havuzdan nesne alacağız. Yani biz sistemden birden fazla nesneler yaratıp, daha sonra ihtiyaç duyduğumuz zaman eğer istediğimiz tipte nesne havuzda var ise var olanı dönecek yok ise yaratıp havuza atılacak. Örneğin DAO sınıfları. İleride DAO tasarım kalıbına da ayrıca geleceğim. Veritabanı işleriyle uğraşırken DAO tasarım kalıbını kullanırız ve bir DAO sınıfından bir nesne yarattığımız zaman direkt sınıftan oluşturmaktan ziyade bir havuz içerisinden isteriz ki, eğer zaten varolan bir nesne var ise onu dönsün. Böylelikle performans ve zaman kaybı yaşamayalım. Nesne havuzuna attığımız nesneler sistemin herhangi bir yerinden çağrılabilecek olan nesnelerdir. Şimdi örnek üzerinden gidelim.

Base bir Basket nesnemiz olacak.

Basket.java

public abstract class Basket {
    public String type() {
        return "Base Basket";
    }
}

İçinde type adında bir metodu var ve türünü bize söylüyor. Şimdi bu Basket sınıfını extend eden IronBasket olsun. Sisteme bir sürü sepet ekleyebiliriz.

IronBasket.java

public class IronBasket extends Basket {

    @Override
    public String type() {
        return "Iron Basket";
    }
}

Son olarak BasketSource isimli sınıfımızı yaratalım.

BasketSource.java

public class BasketSource {
    private static BasketSource source = new BasketSource();
    private Map<Class<? extends Basket> , Basket> poolMap = new HashMap<Class<? extends Basket>, Basket>();

    private BasketSource() {
    }


    public static Basket getBasket(Class<? extends Basket> clazz) throws IllegalAccessException, InstantiationException {
        Basket b = source.poolMap.get(clazz);
        if (b == null) {
            b = clazz.newInstance();
            source.poolMap.put(b.getClass(), b);
        }
        return b;
    }
}

Görüldüğü gibi BasketSource sınıfımızdan getBasket diyerek istediğimiz türde sepet alabiliriz. Sistemde eğer o sepet yoksa yaratılacak varsa da bize yaratılmış olan sepeti verecek.

Main.java

public class Main {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Basket basket = BasketSource.getBasket(IronBasket.class);
        System.out.println(basket.type() + " " + basket.toString());
        Basket basket2 = BasketSource.getBasket(IronBasket.class);
        System.out.println(basket.type() + " " + basket.toString());
    }
}

Kodun çıktısına bakınca aynı nesneyi bize verdiğini görüyoruz. Object Pool tasarım kalıbı, kontrollü nesneler oluşturulmak istendiğinde, nesne sürecini hızlandırmak istendiğinde veya kullanılacak nesne sayısına sınırlama getirmek istendiğinde tercih edilebilir.

Bir yazının daha sonuna gelmiş olduk. 🙂

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s