Design Pattern #3

Autor: NathalieOhneHerz GitHub

Das Singleton Pattern

Eine einzige Instanz? Her damit?

Hauptartikel: [Design Pattern #1] Was sind die Design patterns


Im Folgenden soll das "Singleton Pattern" genauer beleuchtet werden.


Was ist das Singleton Pattern und wann verwendet man es?

Eine Situation, in der man das Singleton verwendet ist sicher vielen hier im Forum bekannt. Doch zuerst: Was ist das überhaupt? Das Singleton Pattern fällt in die Kategorie der Erzeugungsmuster. Es soll eine einfache Möglichkeit bieten, die Instanz einer Klasse zu bekommen. Mit dem Singleton Pattern soll sichergestellt werden, dass nur eine einzige Instanz dieser Klasse gleichzeitig existiert. Dies ist zum Beispiel bei einem Bukkitplugin der Fall: Es darf nur eine einzige Instanz der Hauptklasse geben. Ähnliches findet sich beim ProxyServer von BungeeCord. Manchmal erfordert der Aufbau des Programmes dies und sichert es durch das Singleton Pattern. Ein weiterer Vorteil findet sich darin, dass die Instanz einer Klasse überall verfügbar ist. Desweiteren wird die Instanzierung der Klasse zentralisiert und man kann sie einfach abändern. Nur die Klasse allein kann eine Instanz erzeugen und nur sie bestimmt wie die Klasse am Ende aussieht.


Implemention in Java

Im folgenden soll die unanfechtbare Königin der Welt gezeigt werden:

package de.nathalieoneill.devtek; /** * @author Nathalie */ public class DevTekQueenOfTheUniverse { private static DevTekQueenOfTheUniverse instance = null; private final String name; private DevTekQueenOfTheUniverse(String name) { this.name = name; } public String getName() { return name; } public static DevTekQueenOfTheUniverse getInstance() { if (instance == null) return new DevTekQueenOfTheUniverse("Nathalie"); return instance; } }

Verwendung:

package de.nathalieoneill.devtek; /** * @author Nathalie */ public class DevTek { public static void main(String[] args) { DevTekQueenOfTheUniverse queenOfTheUniverse = DevTekQueenOfTheUniverse.getInstance(); System.out.println("The Queen is: " + queenOfTheUniverse.getName()); /* WE HATE THE QUEEN; WE NEED A NEW ONE! */ queenOfTheUniverse = DevTekQueenOfTheUniverse.getInstance(); System.out.println("The Queen is: " + queenOfTheUniverse.getName()); /* AAARRRRRRRRRRGHHHHHHHHHHHH WHAT TO DO? */ /* Compiler error: Error:(23, 30) java: DevTekQueenOfTheUniverse(java.lang.String) has private access in de.nathalieoneill.devtek.DevTekQueenOfTheUniverse */ queenOfTheUniverse = new DevTekQueenOfTheUniverse("Me"); /* MUHAHAHAH, there is only one Queen. */ } }

Ein Beispiel dass hier vermutlich mehr Leute anspricht:

package de.nathalieoneill.devtek; /** * @author Nathalie */ public class DevTek extends JavaPlugin { private static DevTek instance; @Override public void onEnable() { instance = this; } public static DevTek getInstance() { return instance; } }
package de.nathalieoneill.devtek; /** * @author Nathalie */ public class DevTekListener { public void startUpdateTask() { Bukkit.getScheduler().runTask(DevTek.getInstance(), new Runnable() { public void run() { } }); } }

Ich hoffe dass ich euch das Singleton Pattern näherbringen konnte.

Mit freundlichen Grüßen
Nathalie