Singleton Pattern
Auf gehts, das nächste Pattern nach Strategy.
Heute geht es darum, sicherzustellen, das von einer Klasse nur eine Instanz erstellt werden kann, dies ist bspw. bei einer Logging Klasse, einem Desktop Programm oä. nützlich.
Im Grunde verhindert dieses Pattern das Erstellen von Instanzen durch den Konstruktor.
Der ganze Trick besteht darin, den Konstruktor private zu setzen, sodass dieser nur intern verwendet werden kann.
Zudem braucht es einen statischen Member in der Klasse, der die einzigartige Instanz hält.
Um an trotzdem von Aussen an eine Instanz zu kommen, spendieren wird der Klasse eine öffentliche Methode bspw. Namens "getInstanz", in dieser wird - wen noch nicht vorhanden - ein Objekt erstellt, und zurückgegeben.
Eine Klasse die das Singleton Pattern anwendet, ist nicht "nur" ein Singleton, sondern enthält (sinnvollerweise) immer auch noch weitere Daten und Methoden (Wie am zweiten Beispiel zu sehen ist).
(Die Beispiele lehnen sich an Java an, in C# wirds auch mit einer Eigenschaft + get gehen)
Minimales Beispiel:
using System;
using System.Collections.Generic;
using System.Text;
namespace SingletonExample
{
class Program
{
static void Main(string[] args)
{
Logger l = Logger.getInstance();
Console.WriteLine(l == null);
Console.Read();
}
}
public class Logger {
private static Logger instance;
private Logger() {
}
public static Logger getInstance() {
if (instance == null)
instance = new Logger();
return instance;
}
}
}
Ein "erweitertes" Beispiel mit mehr Sinn:
using System;
using System.Collections.Generic;
using System.Text;
namespace SingletonExample
{
public class App
{
private Logger _logger;
public void Run() {
this._logger = Logger.getInstance();
this._logger.Add("Programm Fehler");
this._logger = Logger.getInstance();
foreach (string error in this._logger.Errors) {
Console.WriteLine(error);
}
Console.Read();
}
}
public class Logger
{
private List<string> _errors = new List<string>();
private static Logger instance;
public List<string> Errors {
get { return this._errors; }
set { this._errors = value; }
}
private Logger() { }
public static Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
public void Add(string error) {
this._errors.Add(error);
}
}
}
Definition des Singleton Patterns:
Das Singleton-Muster sichert, dass es nur eine Instanz einer Klasse gibt, und bietet einen globalen Zugriffspunkt für diese Instanz.
Und am Schluss das kleine aber feine Klassendiagramm:
