Das Singleton – Ein Muster zum streiten?

Das Singleton soll sicher stellen, das es von einer Klasse zur Programmlaufzeit nur eine Instanz gibt. Ich persönlich nutze es zum Beispiel als Fehlerprotokollobjekt oder um eine Datenbankverbindung vorrätig zu halten.

Manche Entwickler sind der Meinung, das das Singleton schlechter Programmierstil sei, ein Hinweis auf Designschwächen. Ich sehe das anders. Es gibt nun mal manchmal die Notwendigkeit, dass man nur eine Instanz von einem Objekt haben darf. Wenn dem so ist, dann ist dass Singleton die beste Lösung.

Der grundsätzliche Lösungsansatz ist folgender:

  1. Der Constructor wird als private deklariert, damit von dem Objekt nicht mehr „von Außen“ eine Instanz erstellt werden kann.
  2. Dafür wird eine Methode GetInstance eingeführt, welche bei Bedarf (also beim ersten Aufruf) das Objekt erstellt und zurück gibt. Existiert bereits diese Instanz, wird sie lediglich zur Verfügung gestellt.

Hier ein Beispiel:

{ *********************************************************************** }
{                                                                         }
{ Delphi Entwursmustersammlung  -- Singleton                              }
{                                                                         }
{ Autor: Thomas Gröschke                                                  }
{ Erstellt: 23.09.2008                                                    }
{                                                                         }
{ *********************************************************************** }

unit Unit_Singelton;

interface

type
  TSingleton = class
  strict private
    constructor Create;
  class var
    FInstance:TSingleton;
  public
    class function GetInstance: TSingleton;
    procedure MeldeDich;
  end;

implementation

uses Dialogs;

constructor TSingleton.Create;
begin
  inherited;
end;

class function TSingleton.GetInstance: TSingleton;
begin
  If FInstance = nil Then
  begin
    FInstance := TSingleton.Create();
  end;
  Result := FInstance;
end;

procedure TSingleton.MeldeDich;
begin
  ShowMessage('Hier bin ich');
end;

end.

Testen zum Beispiel mit zwei Buttons auf einem Formular:


procedure TForm1.Button1Click(Sender: TObject);
var
  FObj : TSingleton;
begin
  FObj := TSingleton.GetInstance;
  FObj.MeldeDich;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TSingleton.GetInstance.MeldeDich;
end;

Anzumerken ist noch, dass dieser Ansatz nicht Threadsicher ist. Da ich noch nie mit Threads gearbeitet habe und ich deswegen von dem Thema keine Ahnung habe, lass ich es an dieser Stelle so stehen.

Weblinks:

delphipraxis: was bringt mir ein singleton?

Wikipedia Man beachte die Nachteile!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>