* docs: reformulate text, add links to further languages and paragraph about the book in central README.md (#2275) * docs: shorten text for link to payhip (#2275) * docs: reformulate german translation for Abstract Document (#2275) * Create folder for Abstract Factory * Create README.md for Abstract Document * Translate README.md for Abstract Document to German * correct typo * docs: add class diagrams for all patterns (#2275) * docs: add missing words in abstract-factory.README.md (#2275) * docs: Create German README.md for Active Object #2275 first text part * docs: finish German translation of README.md for Active Object * docs: translate actor-model into German #2295 * docs: add German translation for Acyclic Visitor #2295 * correct typo * docs: Translate Singleton into German #2295 * docs: Translate Prototype into German #2295 * Delete localization/de/Abstract Factory * insert line break * correct typos in actor-model * realignment of java code block * docs: translate Adapter Pattern into German #2295 * Update README.md change 'lizenz' to 'Lizenz' in badge * Update README.md translate 'benefits' and 'trade-offs' * remove additional bullet point after line break * correct indentation * docs: translate Dependency Injection into German #2295 * docs: translate Bridge into German #2295 * correct typos * docs: Translate Builder into German * delete english text * little changes in formulation * Update README.md change link to image * docs: remove spanish files (#2275) * docs: remove non-translated patterns (#2275) * Create README.md docs: Translate Step Builder into German #2275 * Create README.md docs: Translate Fluent Interface into German #2275 * eager is eifrig, not gierig * Translate Chain of Responsibility into German #2275
shortTitle, category, language, tag
| shortTitle | category | language | tag | ||||
|---|---|---|---|---|---|---|---|
| Singleton | Creational | de |
|
Alternativbezeichnung
- Single Instance
Zweck
Sicherstellen, dass es nur eine Instanz einer Klasse gibt, und einen globalen Zugriffspunkt auf diese Instanz bereitstellen.
Detaillierte Erklärung
Analogie aus der Realität
Das Singleton-Pattern entspricht der Ausgabe von Pässen durch die Regierung. Jeder Bürger darf zu jeder Zeit nur einen Pass besitzen. Die Meldebehörde stellt sicher, dass niemandem ein zweiter Pass ausgestellt wird. Wenn ein Bürger ins Ausland reist, benötigt er seinen Pass, der als einzigartiger weltweit anerkannter Nachweis seiner Identität dient.
In einfachen Worten
Es darf nur ein einziges Objekt dieser Klasse erzeugt werden.
Wikipedia sagt
In der Softwareentwicklung ist das Singleton ein Entwurfsmuster, das die Instanziierung einer Klasse auf ein einziges Objekt beschränkt. Dies ist sinnvoll, wenn genau ein Objekt benötigt wird, das Aktionen über das gesamte System hinweg koordiniert.
Ablaufdiagramm
Programmbeispiel
vgl. Joshua Bloch, Effective Java 2nd Edition, Seite 18
Die beste Art der Implementation eines Singletons ist ein Enum mit nur einem Element.
public enum EnumIvoryTower {
INSTANCE
}
So wird es verwendet:
var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
LOGGER.info("enumIvoryTower1={}", enumIvoryTower1);
LOGGER.info("enumIvoryTower2={}", enumIvoryTower2);
Ausgabe in der Konsole:
enumIvoryTower1=com.iluwatar.singleton.EnumIvoryTower@1221555852
enumIvoryTower2=com.iluwatar.singleton.EnumIvoryTower@1221555852
Verwendung
Ein Singleton sollte verwendet werden, wenn
- genau eine Instanz der Klasse benötigt wird, die für Nutzer über einen wohldefinierten Zugriffspunkt erreichbar ist.
- es möglich sein soll, diese Klasse durch Vererbung zu erweitern, ohne dass bei Verwendung der erweiterten Instanz Codeänderungen nötig sind.
Reale Anwendungen in Java
- Logging-Klassen
- Konfigurationsklassen in vielen Anwendungen
- Verbindungspools
- Dateimanager
- java.lang.Runtime#getRuntime()
- java.awt.Desktop#getDesktop()
- java.lang.System#getSecurityManager()
Vor- und Nachteile
Vorteile:
- Kontrollierter Zugriff auf die einzige Instanz.
- Namensraum wird nicht unnötig belastet.
- Operationen und Darstellungen können durch Vererbung verfeinert werden.
- Bei Bedarf auch mehrere Instanzen möglich.
- Flexibler als Klassenoperationen
Nachteile:
- Schwierig zu testen wegen globalem Status.
- Möglicherweise komplexeres Lebenszyklusmanagement.
- Bei Parallelität sind ohne sorgfältige Synchronisierung Engpässe möglich.
Verwandte Patterns
- Abstract Factory: Oft verwendet, um sicherzustellen, dass nur eine Instanz existiert.
- Factory Methoden: Das Singleton-Pattern kann implementiert werden, indem über eine Factory-Methode die Instanzerzeugung gekapselt wird.
- Prototyp: Hier müssen keine Instanzen erzeugt werden. Das Pattern kann zusammen mit dem Singleton verwendet werden, um einzige Instanzen zu verwalten.
