Das gute Singleton…

Singleton – soll heute Abend mal das Thema sein.
Nachdem ich mich die hälfte des Tages damit beschäftigt habe, denke ich in etwa zu wissen worum es sich nun hierbei handelt.
Singleton beschreibt das Vorgehen wie man eine Klasse aufzubauen hat, welche nur ein einziges mal Instanziiert werden soll.
Sinn macht das ganze in meinen Augen z.B. in einer Datenbank-Klasse, die nicht dauernd für jeden Zugriff neu Instalziiert werden muss und somit dauernd eine neue Verbindung auf machen würde.

Hier nun also meine Erfahrungen mit dem Singleton 🙂

Hier erst einmal eine kleine normale Klasse, wie sie Jeder von uns bauen würde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MeineKlasse
{ 
	private int debug = 0;
	public MeineKlasse()
	{
		// Irgendwas im Konstruktor...
	}
 
	public void test()
	{
		debug = debug + 1;
		System.Windows.Forms.MessageBox.Show("Test - "+debug.ToString());
	}
}

Ich habe den Konstruktor der Vollständigkeit mal mit rein gesetzt.
Das int „debug“ zählen wir nun bei jedem Methodenaufruf der Methode „test()“ einen höher.
In einem Testknopf auf einem Formular wollen wir diese Klasse Instanziieren und die test()-Methode aufrufen:

1
2
MeineKlasse myclass = new MeineKlasse();
myclass.test();

Da wir die Klasse nun bei jedem Aufruf via Knopfdruck neu instanziieren, bekommen wir als Ausgabe nur immer die Messagebox mit dem Inhalt „Test – 1“ angezeigt.

Ich denke bis hier hin ist noch alles verständlich 🙂

Wie sieht das ganze nun aber als Singleton aus?
Ziel der Übung soll sein, das die Klasse nur EINMAL instanziiert wird, was für unser Beispiel bedeuten würde, das dich der debug-Zähler wirklich bei jedem Aufruf um einen wert inkrementieren sollte.

Hier der Code der Klasse:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public sealed class MeineSingletonKlasse
{
	private readonly static MeineSingletonKlasse MySingletonInstance = new MeineSingletonKlasse();
	private int debug = 0;
 
	public static MeineSingletonKlasse GetInstance
	{
		get
		{
			return MySingletonInstance;
		}
	}
 
	private MeineSingletonKlasse()
	{
		//wieder Irgendwas im Konstruktor...
	}
 
	public void test()
	{
		debug = debug + 1;
		System.Windows.Forms.MessageBox.Show("Test - "+debug.ToString());
	}
}

Im Prinzip machen wir jetzt nichts anderes als über die Statische Eigenschaft „GetInstance“ auf die instanziierte Klasse zu zugreifen.
Da die Eigenschaft Statisch ist, muss man die Klasse nicht vorher instanziieren um darauf zugreifen zu können.
Der Aufruf im Testknopf der Form würde sich so ändern:

1
2
MeineSingletonKlasse mysingletonclass = MeineSingletonKlasse.GetInstance;
mysingletonclass.test();

Führen wir den Code aus, bekommen wir jetzt tatsächlich für jeden Klick auf den Testknopf einen inkrementierten Wert in der Messagebox zurück.

Hach wie schön… ich finde das voll toll 🙂

leave your comment

*

Unterstütze den Frickelblog!