Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wie Singleton Objekt freigeben? (https://www.delphipraxis.net/169861-wie-singleton-objekt-freigeben.html)

Jazzman_Marburg 16. Aug 2012 17:59

Wie Singleton Objekt freigeben?
 
Hallo Gemeinde.
Ich habe mir ein Singleton Objekt gebaut -- und es funktioniert prima: Es wird gleich zu Programmstart erzeugt und ich kann alle Methoden aufrufen - und vor allem: Ich kann keine zweite Instanz erstellen.
Jetzt möchte ich aber dieses Objekt auch irgendwann freigeben -- aber ich erreiche den Destructor nicht. Wenn ich es mit Singleton.Destroy versuche bekomme ich den Fehler:
Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt.
Wie werde ich nun mein Singleton wieder los?
Delphi-Quellcode:
type
  Singleton = class
  private
    class var

      _instance : Singleton;

      fTest1: integer;
      fTest2: integer;
      fTest3: integer;

      ...

  public

  //  constructor Create; entfällt, da INITIALIZE

    destructor Destroy; override;

    class function Instance : Singleton;
    class function NewInstance: TObject; override;
...
Achso, ich habe das Singleton nach dieser Methode gebaut.

Habt ihr eine Idee?

Vielen Dank
Gruß
Jazzman

himitsu 16. Aug 2012 18:16

AW: Wie Singleton Objekt freigeben?
 
Delphi-Quellcode:
Singleton.Instance.Destroy;
oder besser
Delphi-Quellcode:
Singleton.Instance.Free;
:zwinker:

Du willst ja die Instanz (das instantiierte Objekt) freigeben und nicht den Klassen-Typ.

Oder zu baust dir zusätzlich noch eine public
Delphi-Quellcode:
class procedure Singleton.FreeInstance;
begin
  FreeAndNil(_instance);
end;

Jazzman_Marburg 16. Aug 2012 18:25

AW: Wie Singleton Objekt freigeben?
 
Zitat:

Zitat von himitsu (Beitrag 1178519)
Delphi-Quellcode:
Singleton.Instance.Destroy;
oder besser
Delphi-Quellcode:
Singleton.Instance.Free;
:zwinker: ...

Yippieh yeah! :thumb:

So einfach manchmal!

Lieben Dank & Gruß
Jazzman

r2c2 17. Aug 2012 19:31

AW: Wie Singleton Objekt freigeben?
 
Hier mein gebetsmühliger Warnhinweis auf der Packungsbeilage zu Singletons: http://www.christian-rehn.de/2009/09/03/singletons/

Wenn ich Singletons verwende (und das ist eher selten), verwende ich eher eine testbare Variante.

mfg

Christian

jaenicke 17. Aug 2012 20:43

AW: Wie Singleton Objekt freigeben?
 
Da du Delphi XE hast, geht das noch sehr viel besser:
Delphi-Quellcode:
type
  TSingleton = class
  private
    class var
      FInstance: TSingleton;

      FTest1: Integer;
      FTest2: Integer;
      FTest3: Integer;
    class function GetInstance: TSingleton; static;
  public
    class destructor Destroy;

    class property Instance: TSingleton;
  end;

[...]

class function GetInstance: TSingleton;
begin
  if not Assigned(FInstance) then
    FInstance := TSingleton.Create;
  Result := FInstance;
end;

class destructor Destroy;
begin
  if Assigned(FInstance) then
    FInstance.Free;
end;
So brauchst du dich weder um die Erzeugung noch um die Freigabe kümmern. Und das ist bei einem Singleton finde ich sehr wichtig. Alternativ bietet sich für den Zweck die Verwendung von Interfaces an.

himitsu 17. Aug 2012 21:19

AW: Wie Singleton Objekt freigeben?
 
Genauso wie man hier das Erstellen der Instanz blockt, sollte man hier auch noch externe das Freigeben der Instanz verbieten.

Furtbichler 17. Aug 2012 21:20

AW: Wie Singleton Objekt freigeben?
 
Zitat:

Zitat von r2c2 (Beitrag 1178653)
Hier mein gebetsmühliger Warnhinweis auf der Packungsbeilage zu Singletons

Screen, Mouse, etc. sind also böse Singletons? Oder gar keine?

Ich denke, wenn ich mich über Unikate mit der Außenwelt unterhalten möchte, komme ich um Singletons nicht herum. Ob man sie als statische Klasse implementiert oder Singleton, ist doch gehupft wie gesprungen.

Aber unabhängig davon: Ein Singleton zu implementieren deutet schon auf schlechtes Design hin.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz