![]() |
AW: Verwenden von Pointern
..ein Singleton hat den Charme, dass davon nur eine Instanz erstellen kann.
Von einer globalen Klasse können jede Menge Instanzen erstellt werden. Grüße Klaus |
AW: Verwenden von Pointern
Zitat:
Ich würde für ein Singleton eher so vorgehen:
Delphi-Quellcode:
Dann muss ich gar nicht wissen, das das ein Singleton ist, sondern kann mir immer, wenn ich es brauche, eine Instanz erstellen. Die Objektlogik mappt das ja auf die eine Instanz. Zudem habe ich so keine Möglichkeit, mehrere Instanzen zu erstellen.
type
TSingleton = Class private class var fInstance: TSingleton; class var fRefCnt : Integer; class function NewInstance: TObject; Override; procedure FreeInstance; override; End; implementation { TSingleton } procedure TSingleton.FreeInstance; begin if fRefCnt=1 then begin inherited FreeInstance; fInstance:=Nil; end; dec (fRefCnt); end; class function TSingleton.NewInstance: TObject; begin if fInstance=Nil then fInstance := TSingleton(inherited NewInstance); Result := fInstance; inc(fRefCnt); end; end. Ich persönlich halte das für sauberer, als umständlich über 'GetInstance' auf die globalen Daten zuzugreifen. |
AW: Verwenden von Pointern
Alternative: Wenn die Forms nur modal angezeigt werden, könnte auch jede Form ihre eigene Instanz haben. Hierzu die Klasse von TPersitent ableiteten und in Settern die jeweils aktuellen Werte mit Assign kopieren.
|
AW: Verwenden von Pointern
Zitat:
|
AW: Verwenden von Pointern
Zitat:
|
AW: Verwenden von Pointern
Wo ist der unterschied zwischen einem 'zwangsweise' einmalig erzeugtem Objekt und einem, das per Konvention nur einmal erstellt wird (Form1, Application etc.)?
Beispiel: Ein Datenmodul wird nur einmal instantiiert und verwendet, obwohl es problemlos mehrere Instanzen geben könnte. Eine Singleton-Klasse dagegen sorgt dafür, das man nicht mehrere Instanzen erstellen *kann*. Unterm Strich kommt jedoch das Gleiche heraus und 'zu warten' gibt es da nicht viel. PS: Ich habe deine Variante (#8) vor einiger Zeit mal umgesetzt: Für mich war das sehr umständlich und auch unnötig. Da ist mir meine Variante (die das Singleton-Verhalten komplett kapselt) allemal lieber. Dies ist auch gängige Praxis in anderen OOP-Sprachen. Ich kenne das z.B. von log4net (ein Logger für C#): Dort, wo man einen Logger benötigt, holt (=instantiiert) man sich mal eben einen. Ob das ein Singleton ist oder nicht, weiß ich nicht und es interessiert mich auch nicht. Erkläre mir doch mal, was Du unter 'ein Singleton-Objekt warten' verstehst. |
AW: Verwenden von Pointern
Ich würde auch nicht zwanghaft an einem bestimmten (übertriebenen) Prinzip festhalten.
Die einfachste funktionierende Lösung ist die beste. Wenn ich ein Framework baue, das in vielen Projekten verwendet werden soll, ist ggf. eine etwas allgemeinere Lösung mit mehr Implementierungsaufwand notwendig. Wenn es (wie ich Getox verstanden habe) nur um die Instanziierung eines BL-Objektes geht, kann das im Initialisierungsabschnitt der Unit oder im Mainform erledigt werden, ohne dass man dadurch irgendwelche Probleme erhält. Der Entwickler weiß ja selbst, ob und wann er eine Instanz erzeugt. Manchmal tun mir die Neueunsteiger wirklich leid wenn sie eine einfache Lösung suchen und dann hier mit Grundsatzdebatten erschlagen werden... :wink: |
AW: Verwenden von Pointern
Zitat:
Delphi-Quellcode:
type
TDeineKlasse = class(TObject) private class var FInstance: TDeineKlasse; constructor Create; class function GetInstance: TDeineKlasse; static; public class destructor Destroy; class property Instance: TDeineKlasse read GetInstance; end; implementation class function TDeineKlasse.GetInstance: TDeineKlasse; begin if not Assigned(FInstande) then FInstance := TDeineKlasse.Create; Result := FInstance; end; class destructor TDeineKlasse.Destroy; begin if Assigned(FInstance) then FInstance.Free; end; |
AW: Verwenden von Pointern
Ab wann gibt es im Delphi eigentlich Klassenvariablen und Klassenkonstruktoren?
Die Funktionalität ist die gleiche wie eine Realisierung im Initialization- und Finalization-Abschnitt einer Unit. Ältere Delphi-Versionen können das nicht (also evtl. vom TE nicht verwendbar). Vielleicht ist es auch für das Verständnis eines Delphi-Neulings nicht immer unbedingt zweckmäßig. |
AW: Verwenden von Pointern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz