Commit e0cc5990 authored by Blanke, Daniela's avatar Blanke, Daniela
Browse files

Update design-patterns-singleton.html

parent c5aa451d
Pipeline #8012 failed with stage
in 27 seconds
<p>Beginnen wir mit einem der einfachsten Erzeugungsmuster: dem Einzelstück (engl. <i>Singleton</i>). Das Singleton-Muster ist eng mit der Frage verknüpft, wie zur Laufzeit einer objektorientierten Anwendung sichergestellt werden kann, dass max. 1 Objekt einer Klasse erzeugt werden kann.</p>
<p>Singleton-Muster soll über folgendes Beispiel motiviert werden: Stellen wir uns vor, dass wir in einer Java-Anwendung eine Verbindung zu einer Datenbank aufbauen wollen. Dazu wird die folgende Klasse <code>DatabaseConnection</code> entworfen, die eine Methode zum Verbindungsaufbau und weitere Methoden zum Abfragen und Verändern der Daten enthält. Diese fachlichen Methoden werden in den Code-Listings weiter unten ausgeblendet.</p>
<p>Das Singleton-Muster soll über folgendes Beispiel motiviert werden: Stellen wir uns vor, dass wir in einer Java-Anwendung eine Verbindung zu einer Datenbank aufbauen wollen. Dazu wird die folgende Klasse <code>DatabaseConnection</code> entworfen, die eine Methode zum Verbindungsaufbau und weitere Methoden zum Abfragen und Verändern der Daten enthält. Diese fachlichen Methoden werden in den Code-Listings weiter unten ausgeblendet.</p>
<pre><code class="language-java line-numbers">public class DatabaseConnection {
public boolean connect(String host, String user, String pass, String db) { /* ... */ }
......@@ -8,7 +8,7 @@
/* ... */
}</code></pre>
<p>Es ist ausreichend, wenn diese Datenbankverbindung beim Start der Anwendung nur einmal aufgebaut wird, und es demzufolge nur ein Objekt dieser Klasse gibt. Dieses Objekt entspricht einer globalen Variable. Es soll nicht möglich sein, dass aus Methoden in beliebigen anderen Klassen in unserem Projekt oder durch Dritte die unsere Klasse weiterverwenden <code>DatabaseConnection</code>-Instanzen erzeugt werden können. Um genau das zu verhindern, wird die Sichtbarkeit des Konstruktors der Klasse <code>DatabaseConnection</code> auf <code>private</code> gesetzt. Damit können nur noch aus der Klasse selbst Instanzen erzeugt werden. In der Klasse selbst wird ein statisches Attribut vom Typ <code>DatabaseConnection</code> angelegt, auf das über eine ebenfalls statische und öffentliche Methode zugegriffen werden kann. In folgendem Code wird das Attribut <code>instance</code> bereits beim Laden der Klasse instantiiert.</p>
<p>Es ist ausreichend, wenn diese Datenbankverbindung beim Start der Anwendung nur einmal aufgebaut wird, und es demzufolge nur ein Objekt dieser Klasse gibt. Dieses Objekt entspricht einer globalen Variable. Es soll nicht möglich sein, dass aus Methoden in beliebigen anderen Klassen in unserem Projekt oder durch Dritte, die unsere Klasse weiterverwenden, <code>DatabaseConnection</code>-Instanzen erzeugt werden können. Um genau das zu verhindern, wird die Sichtbarkeit des Konstruktors der Klasse <code>DatabaseConnection</code> auf <code>private</code> gesetzt. Damit können nur noch aus der Klasse selbst Instanzen erzeugt werden. In der Klasse selbst wird ein statisches Attribut vom Typ <code>DatabaseConnection</code> angelegt, auf das über eine ebenfalls statische und öffentliche Methode zugegriffen werden kann. In folgendem Code wird das Attribut <code>instance</code> bereits beim Laden der Klasse instantiiert.</p>
<pre><code class="language-java line-numbers">public class DatabaseConnection {
// Singleton object
......@@ -20,7 +20,7 @@
/* ... */
}</code></pre>
<p>Soll die Erzeugung des Singleton-Objekt nicht beim Laden der Klasse sondern erst beim ersten Zugriff erfolgen (<i>Lazy Creation</i>), muss die Zugriffsmethode durch das Java-Schlüsselwort <code>synchronized</code> als kritischer Abschnitt geschützt werden, so dass nur ein paralleler <i>Thread</i> gleichzeitig diese Methode durchlaufen kann. Threads und kritische Abschnitte werden erst später im Kapitel <a href="#unit-sync" class="navigate">Synchronisation von Threads</a> behandelt.</p>
<p>Soll die Erzeugung des Singleton-Objekts nicht beim Laden der Klasse, sondern erst beim ersten Zugriff erfolgen (<i>Lazy Creation</i>), muss die Zugriffsmethode durch das Java-Schlüsselwort <code>synchronized</code> als kritischer Abschnitt geschützt werden, sodass nur ein paralleler <i>Thread</i> gleichzeitig diese Methode durchlaufen kann. Threads und kritische Abschnitte werden erst später im Kapitel <a href="#unit-sync" class="navigate">Synchronisation von Threads</a> behandelt.</p>
<p>Wenn das Beispiel der Datenbankverbindung verallgemeinert wird (d.h. die Klasse heißt nun <code>Singleton</code> anstatt <code>DatabaseConnection</code>), erhalten wir das geläufige Erzeugungsmuster Singleton, das zusichert, dass zur Laufzeit max. 1 Objekt einer Klasse instantiiert werden kann.</p>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment