Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.819 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Designfrage zu Klassen- und Instanzproperties

  Alt 9. Jun 2021, 13:08
Wenn es wirklich nur eine Instanz für diese Klasse in deinem Programm geben soll, dann spricht m.M. nichts gegen deinen Ansatz. Die Alternative wäre, diese eine Instanz jeweils als Parameter oder anderweitig mitzugeben wo sie gebraucht wird. Das halte ich aber für völlig unpragmatisch und in vielen Fällen für kontraproduktiv.

Natürlich gibt es andere Ansätze, mit denen diese Singleton-Instanz vermieden werden kann, wobei in den meisten Fällen dann doch intern wieder nur eine Instanz vorgehalten wird, was ja auch eigentlich die Vorgabe in diesem Anwendungsfall ist. Jetzt irgendwelche Klimmzüge zu machen, um formal dem Singleton-Shaming zu entgehen, erscheint mir nicht wirklich sinnvoll.

Wenn du es etwas flexibler haben möchtest, dann implementiere eine Factory-Funktionalität, die du bei Bedarf anpassen kannst um ein anderes Verhalten für Tests oder als Mock zu ermöglichen.
Delphi-Quellcode:
type
  TMyConfigClass = class of TMyConfig;
  TMyConfig = class
  strict private
    class var FMyConfigClass: TMyConfigClass;
    class var FInstance: TMyConfig;
    class function GetInstance: TMyConfig; static;
    class destructor ClassDestroy;
  private
    FFeld: integer;
  public
    property Feld: integer read FFeld write FFeld;
    class property Instance: TMyConfig read GetInstance;
    class property MyConfigClass: TMyConfigClass read FMyConfigClass write FMyConfigClass;
  end;

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

class destructor TMyConfig.ClassDestroy;
begin
  FInstance.Free;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat