Pula obiektów (object pool) to wzorzec projektowy należący do grupy wzorców kreacyjnych. Jego głównym zadaniem jest przechowywanie puli zainicjalizowanych obiektów. Takie działanie ma na celu zapobiegnięciu sytuacji gdy potrzebne jest częste tworzenie obiektów których czas inicjalizacji jest kosztowny. Pobranie obiektu z puli powoduje blokadę dostępu aż do wywołania procesu zwalniającego.
Przykład zastosowania wzorca puli obiektów
Przykład klasy zarządzanej przez pulę obiektów:
public class PoolItem {
private boolean inUse = false;
private Object item;
PoolItem(Object item) {
this.item = item;
}
public Object getItem() {
return item;
}
public boolean isInUse() {
return inUse;
}
public void setInUse(boolean inUse) {
this.inUse = inUse;
}
@Override
public boolean equals(Object obj) {
if ((obj != null) && (obj instanceof PoolItem)) {
PoolItem poolItem = (PoolItem) obj;
return poolItem.getItem().equals(this.getItem());
} else {
return false;
}
}
@Override
public int hashCode() {
int hash = 7;
hash = 53 * hash + (this.item != null ? this.item.hashCode() : 0);
return hash;
}
}
Implementacja puli obiektów:
public class Pool {
private List items = new ArrayList();
public void add(Object obj) {
System.out.println("Dodano: " + obj);
items.add(new PoolItem(obj));
}
public Object acquire() {
Object item = null;
for (PoolItem poolItem : items) {
if (poolItem.isInUse() == false) {
poolItem.setInUse(true);
item = poolItem.getItem();
break;
}
}
System.out.println("Pobrano: " + item);
return item;
}
public void release(Object someObject) {
int index = items.indexOf(new PoolItem(someObject));
if (index != -1) {
PoolItem poolItem = items.get(index);
poolItem.setInUse(false);
System.out.println("Zwolniono: " + poolItem.getItem());
}
}
}
Przykład użycia puli obiektów:
public class Main {
public static void main(String[] arg) {
Pool pool = new Pool();
for (int i = 0; i < 2; i++) {
pool.add("Obiekt" + i);
}
String someString1 = (String) pool.acquire();
String someString2 = (String) pool.acquire();
String someString3 = (String) pool.acquire();
pool.release(someString1);
String someString4 = (String) pool.acquire();
}
}
Komentarze
Dodaj nowy komentarz