Das Java-Singleton-Muster ist ein weit verbreitetes Entwurfsmuster, das garantiert, dass eine Klasse nur eine Instanz hat und einen globalen Zugriffspunkt darauf bereitstellt. Stellen Sie sich das so vor, als würde ein einzelner Manager ein Team beaufsichtigen – es gibt nur einen, und jeder interagiert über diesen einzigen Ansprechpartner. In diesem Artikel werden die Implementierung des Musters und verschiedene Ansätze in Java erläutert.
Es gibt mehrere Ansätze, jeder mit seinen eigenen Kompromissen:
1. Lazy Initialization: Erstellt die Instanz nur, wenn sie zum ersten Mal benötigt wird.
<code class="language-java">import java.io.Serializable; public class LazySingleton implements Serializable { private static LazySingleton instance; private LazySingleton() { if (instance != null) { throw new IllegalStateException("Instance already created"); } } public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } private Object readResolve() { return getInstance(); } }</code>
2. Thread-sicherer Singleton: Verwendet synchronized
, um Thread-Sicherheit während der Instanzerstellung zu gewährleisten.
<code class="language-java">import java.io.*; public class ThreadSafeSingleton implements Serializable { private static final long serialVersionUID = 1L; private static ThreadSafeSingleton instance; private ThreadSafeSingleton() { if (instance != null) { throw new IllegalStateException("Instance already created"); } } public static synchronized ThreadSafeSingleton getInstance() { if (instance == null) { instance = new ThreadSafeSingleton(); } return instance; } private Object readResolve() { return getInstance(); } }</code>
3. Doppelt überprüfte Sperre: Optimiert die Thread-Sicherheit durch Minimierung des Synchronisierungsaufwands.
<code class="language-java">import java.io.*; public class DoubleCheckedLockingSingleton implements Serializable { private static final long serialVersionUID = 1L; private static volatile DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() { if (instance != null) { throw new IllegalStateException("Instance already created"); } } public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } private Object readResolve() { return getInstance(); } }</code>
4. Bill Pugh Singleton (empfohlen):Verwendet eine statische innere Klasse, um verzögerte Initialisierung und Thread-Sicherheit zu gewährleisten.
<code class="language-java">import java.io.*; public class BillPughSingleton implements Serializable { private static final long serialVersionUID = 1L; private BillPughSingleton() { if (SingletonHelper.INSTANCE != null) { throw new IllegalStateException("Instance already created"); } } private static class SingletonHelper { private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance() { return SingletonHelper.INSTANCE; } private Object readResolve() { return getInstance(); } }</code>
5. Enum Singleton (moderner Ansatz): Nutzt die inhärente Thread-Sicherheit und Serialisierungsverarbeitung von Enums. Dies wird aufgrund seiner Einfachheit und Robustheit oft als der beste Ansatz angesehen.
<code class="language-java">public enum EnumSingleton { INSTANCE; public void showMessage() { System.out.println("Hello from Enum Singleton!"); } }</code>
Das obige ist der detaillierte Inhalt vonDas Singleton-Muster in Java verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!