Die Singleton-Klasse beschränkt die Objekterstellung für eine Klasse auf nur eines in der Java Virtual Machine. Es hilft auch bei der Bereitstellung eines globalen Zugriffspunkts auf das Objekt. Dieses Entwurfsmuster wird häufig für Caching, Abstract Factory, Protokollierung, Prototypen usw. verwendet. Es wird auch in Java-Kernklassen wie java.awt.Desktop und java.lang.Runtime verwendet. In java.lang.Runtime stellt Java eine Klasse Runtime bereit, die die aktuelle Laufzeitumgebung angibt, in der die Anwendung ausgeführt wird. Dies hilft bei der Schnittstelle zwischen der Anwendung und der Laufzeitumgebung. Es sollte ein Objekt vorhanden sein, da die JRE eindeutig ist. In java.awt.Desktop ermöglicht die Klasse Desktop Anwendungen, einen URI oder eine Datei mit dem Standardbrowser, E-Mail-Client usw. des Benutzers zu starten. Auch hier darf es nur eine Instanz der Klasse geben.
Singleton-Klassen können auf zwei Arten erstellt werden.
Starten Sie Ihren kostenlosen Softwareentwicklungskurs
Webentwicklung, Programmiersprachen, Softwaretests und andere
Sehen wir uns nun das UML-Klassendiagramm (Unified Modeling Language) der Singleton-Klasse an.
Im Klassen-UML-Diagramm stellt die erste Partition den Namen einer Klasse dar, die zweite Partition stellt die Attribute dar und die dritte Partition stellt die Methoden dar. Außerdem kennzeichnet + öffentliche Attribute oder Methoden und – private Attribute oder Methoden. In unserem UML-Diagramm der Singleton-Klasse lautet der Klassenname beispielsweise Singleton und sie verfügt über eine Hauptmethode. Die Hauptmethode, getInstance-Methode und sampleMethod sind die einzigen Methoden, die im obigen Diagramm öffentlich sind. Konstruktor- und Instanzattribute werden im Rahmen unserer Implementierung als privat festgelegt. Diese öffentliche Main-Methode fragt nach der Instanz und getInstance gibt sie an die Main-Methode zurück.
Basierend auf der Instanziierung besteht der einzige Unterschied zwischen der normalen Java-Klasse und der Singleton-Klasse darin, dass wir in der Java-Klasse einen Konstruktor verwenden, während wir in Singleton die Methode getInstance() verwenden.
Das Designmuster von Singleton hat zwei Formen.
1. Faule Instanziierung
Bei Lazy Instantiation wird eine Klasseninstanz erstellt, wenn sie benötigt wird. Es wird in der Synchronized-Methode oder im Synchronized-Block erstellt, um die Race-Conditions zu vermeiden, die in einer Multithread-Umgebung auftreten können.
2. Frühe Instanziierung
Bei der frühen Instanziierung wird zur Ladezeit eine Instanz erstellt. Auch wenn dies der einfachste Ansatz ist, hat er den Nachteil, dass die Instanzerstellung unabhängig davon erfolgt, ob darauf zugegriffen wird oder nicht.
Ein Beispiel für Lazy Instantiation und Early Instantiation wird im folgenden Abschnitt erläutert.
Wie oben besprochen, kann die Singleton-Klasse in Early Instantiation oder Lazy Instantiation erstellt werden.
Im Folgenden finden Sie die Schritte zur Implementierung der Lazy Instantiation.
1. Legen Sie den Konstruktor als privat fest.
Zum Beispiel erstellen wir eine Klasse, LazyClass. Der Konstruktor wird wie unten gezeigt aussehen.
private LazyClass () { }
2. Erstellen Sie eine private statische Instanz für die erstellte Klasse.
private static LazyClass instance;
3. Erstellen Sie eine statische synchronisierte Methode, die die Klasseninstanz erstellt.
public static synchronized LazyClass getInstance() { }
4. Überprüfen Sie in der Methode getInstance() zunächst, ob eine Instanz vorhanden ist oder nicht. Wenn nicht gefunden, erstellen Sie eines. Andernfalls wird die Instanz zurückgegeben.
if(instance == null) { instance = new LazyClass (); } return instance;
Lassen Sie uns es nun anhand eines Beispielcodes untersuchen.
//Java Program for Lazy Instantiation public class LazyClass { private static LazyClass instance; //set the constructor as private private LazyClass () {} //Checks whether an instance is already in the getInstance method public static synchronized LazyClass getInstance() { //if instance is not present already, create a new one if(instance == null) { instance = new LazyClass (); } // if an instance is present, then return it return instance; } //Sample method that is protected from more than one object creation public void sampleMethod( ) { System.out.println("sampleMethod for lazy singleton"); } public static void main(String[] args) { LazyClass temp=LazyClass.getInstance(); temp.sampleMethod(); } }
Ausgabe:
Anstatt eine Instanz zur Ladezeit zu erstellen, wird sie hier innerhalb des synchronisierten Blocks erstellt. Zum besseren Verständnis wird auch eine Beispielmethode angegeben, die vor der Erstellung mehrerer Objekte geschützt ist.
Sehen wir uns nun die Schritte für die frühe Instanziierung an. Es ähnelt der Lazy-Instanziierung, verwendet jedoch keine synchronisierte Methode oder keinen synchronisierten Block.
1. Legen Sie den Konstruktor als privat fest.
Zum Beispiel erstellen wir eine Klasse, EarlyClass. Der Konstruktor wird wie unten gezeigt aussehen.
private EarlyClass () () { }
2. Erstellen Sie eine private statische Instanz für die erstellte Klasse.
private static EarlyClass <em>ins</em>= new EarlyClass();
3. Erstellen Sie eine statische Methode, die die Klasseninstanz erstellt.
public static EarlyClass getInstance() { }
Im Folgenden finden Sie den Beispielcode für die frühe Instanziierung.
//Java Program for Early Instantiation public class EarlyClass { //Create an instance of the class at load time private static EarlyClass <em>ins</em>= new EarlyClass(); //set the constructor as private private EarlyClass () {} //A static method to get the instance public static EarlyClass getInstance() { return ins; } //A sample method that is protected from more than one object creation public void sampleMethod() { System.out.println("sampleMethod for Early singleton"); } //Main method public static void main(String[] args) { EarlyClass tmp = getInstance(); tmp.sampleMethod(); } }
Ausgabe:
Im obigen Programm wird während der Ladezeit eine Instanz erstellt und mit der Methode getInstance() zurückgegeben. Darüber hinaus wird der Konstruktor im Rahmen der Singleton-Instanziierung als privat festgelegt.
Speichereinsparung ist der Hauptvorteil dieser Verwendung, da ein Objekt wiederverwendet und nicht immer wieder erstellt wird.
In diesem Dokument haben wir erläutert, wie eine Singleton-Klasse mithilfe eines Klassen-UML-Diagramms, eines Algorithmus und eines Beispielcodes funktioniert. Die Singleton-Klasse wird verwendet, wenn wir nur ein Objekt für eine Klasse und einen globalen Zugriffspunkt auf dieses Objekt benötigen. Die beiden Formen, wie z. B. frühe Instanziierung und verzögerte Instanziierung, können je nach Anforderung verwendet werden.
Das obige ist der detaillierte Inhalt vonSingleton-Klasse in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!