Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Design Pattern - Object Pool



  April 16, 2019    Labels:,,,,,,,, 

Object Pool patern'ı prototype patern'ına benzerlik göstermektedir. Prototype patern'ında olduğu gibi yaratılması maliyetli nesnelerin yönetimi konusundaki probleme çözüm getirir. Prototype patern'ından farklı olarak bu patern çok kullanıcıya hizmet veren ağır iş yükü altındaki uygulamalar için kullanışlıdır. Yaratılması maliyetli nesnelerden belli bir sayıda daha önceden yaratılarak bir havuzda tutulur. Daha sonra bu nesneyi kullanmak isteyen istemciler bu sınıf üzerinden nesneye erişim sağlarlar. Daha sonra nesne ile işleri bittiğinde nesne havuza geri koyularak ciddi bir performans artışı sağlanır.
Bu patern'ı uygularken dikkat edilmesi gereken bir konu havuzda tutulacak nesne sayısıdır. Havuzda gereğinden fazla nesne tutmak belleğin kullanımını ciddi şekilde arttıracağı için performans kaybına yol açabilir.

Uygulama
  • Nesneleri havuzda tutacak bir havuz nesnesi yaratılır. Bu nesne tek bir tane olması gerektiği için singleton patern'ini uygulayacak şekilde oluşturulur.
  • Havuz nesnesi üzerine istemciler için nesne referansı alabilecek ve nesne referansını havuza geri bırakabilecekleri metotlar yazılır.



public class ObjectPool {
         
         private const int POOL_SIZE = 10;
         protected static ObjectPool objPool;
         private List<UsedObject> objects;
         
         protected ObjectPool () {
             objects = new ArrayList<>();
         }
         
         public static ObjectPool getPool () {
             if (objPool == null) {
                 objPool = new ObjectPool();
                 for(int i = 0 ; i < POOL_SIZE ; i++) {
                     UsedObject obj = new UsedObject();
                     objects.add(obj);
                 }
             }
             return objPool;
         }
         
         public UsedObject getObject () {
             for(UsedObject obj : objects) {
                 if(!obj.isActive()) {
                     return obj;
                 }
             }
             return null;
         }
         
         public void releaseObject (UseOject obj) {
             obj.setActive(false);
         }
         
         

public class UsedObject{

     private boolean isActive;
     
     public UsedObject () {
         isActive = false;
     }
     
     public void setActive(boolean isActive) {
         this.isActive = isActive;
     }
     
     public boolean isActive () {
         return isActive;
     }
}

public class Client{

     public static void main(String []args){
        // Nesnenin referansına erişilir
        UsedObject obj = ObjectPool.getPool().getObject();
        //Nesne ile ilgili işlemler yapılır
        //...
        //Nesne havuza geri bırakılır
        ObjectPool.getPool().releaseObject(obj);
     }
}

No comments:

Post a Comment