Hauptartikel: [Design Pattern #1] Was sind die Design patterns
Was ist das Object Pool Pattern und wann verwendet man es?
Oft kommt es vor, dass man Objekte wiederverwenden möchte. Das kann verschiedene Gründe haben. Zum Beispiel kann ihre Erzeugung sehr rechenaufwendig sein. Abhilfe schafft das Object Pool Pattern, welches sich zu den Erzeugungsmustern packen lässt. Der Object Pool hält immer eine Anzahl an Instanzen auf Abruf und jederzeit kann man ein Objekt aus dem Pool nehmen, es benutzen und, wichtig, es an den Pool zurückgeben. Manchen mag des Prinzip zum Beispiel aus https://brettwooldridge.github.io/HikariCP/ bekannt sein.
Modellierung
Implementierung in Java
package de.nathalieoneill.devtek.pool;
import java.util.HashMap;
import java.util.Map;
/**
* @author Nathalie
*/
public abstract class Pool<T> {
private final Map<T, Boolean> pooledObjects;
public Pool() {
this.pooledObjects = new HashMap<>();
}
public abstract T create();
public T checkOut() {
T instance;
if (pooledObjects.size() == 0) {
instance = this.create();
} else {
instance = this.pooledObjects.entrySet().stream().filter( entry -> !entry.getValue() ).map(Map.Entry::getKey).findFirst().orElse(null);
}
if (instance == null) instance = this.create();
this.pooledObjects.put(instance, true);
return instance;
}
public void checkIn(T instance) {
this.pooledObjects.put(instance, false);
}
}
Alles anzeigen
package de.nathalieoneill.devtek.pool;
/**
* @author Nathalie
*/
public class Connection {
private final String host;
private final int port;
public Connection(String host, int port) {
this.host = host;
this.port = port;
}
public void fetchData() {
System.out.println("Fetching From " + host + ":" + port);
}
}
Alles anzeigen
package de.nathalieoneill.devtek.pool;
/**
* @author Nathalie
*/
public class ConnectionPool extends Pool<Connection> {
private final String host;
private final int port;
public ConnectionPool(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public Connection create() {
return new Connection(host, port);
}
}
Alles anzeigen
Die Verwendung sähe dann so aus:
package de.nathalieoneill.devtek.pool;
/**
* @author Nathalie
*/
public class DevTek {
public static void main(String[] args) {
final ConnectionPool connectionPool = new ConnectionPool("localhost", 1337);
Connection connection = connectionPool.checkOut();
connection.fetchData();
connectionPool.checkIn(connection);
}
}
Alles anzeigen
Ich hoffe dass ich euch das Object Pool Pattern näher bringen konnte.
Mit freundlichen Grüßen
Nathalie