Design Pattern #10

Autor: NathalieOhneHerz GitHub

Das Object Pool Pattern

Recycling leicht gemacht für jedermann.

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); } }
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); } }
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); } }

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); } }

Ich hoffe dass ich euch das Object Pool Pattern näher bringen konnte.

Mit freundlichen Grüßen
Nathalie