Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Design Paddern Singelton - Oder wie verstecke ich Create? (https://www.delphipraxis.net/138879-design-paddern-singelton-oder-wie-verstecke-ich-create.html)

Highttower 19. Aug 2009 08:06


Design Paddern Singelton - Oder wie verstecke ich Create?
 
Hallo zusammen,

ich suche eine schöne Lösung für das DP der GOF Singelton, in Java und C++ würde ich ganz einfach den Konstruktor Private machen und das Objekt über eine FactoryMethode CreateInstance erzeugen lassen, da ich aber in Delphi es einfach nicht bekomme Create richtig zu verstecken, stehe ich grad auf dem Schlauch wie ich das Richtig mache, oder ist einfach nur der Ansatz Create zu verstecken falsch?

Wäre nett wenn mir jemand helfen könnte,

Tobi

hoika 19. Aug 2009 08:14

Re: Design Paddern Singelton - Oder wie verstecke ich Create
 
Hallo,

so.

Delphi-Quellcode:
unit Bla;

function CreateClass: TMyClass;

interface

implementation

var
  FMyClass: TMyClass;
  bWasCreated: Boolean;

function CreateClass: TMyClass;
begin
  if not bWasCreated then
  begin
    FMyClass:= TMyClass.Create;
    bWasCreated:= True;
  end;
  Result:= FMyClass;
end;

// Initialisierung muss nicht sein, macht Delphi selber (?)
begin
  FMyClass   := NIL;
  bWasCreated := False;
end;
Aufruf erfolgt per CreateClass und zwar sooft du willst.
Es gibt auch den Ansatz, einfach per <>NIL zu prüfen, der gefällt mir aber nicht so.


Heiko

TheFrog 19. Aug 2009 08:18

Re: Design Paddern Singelton - Oder wie verstecke ich Create
 
Hallo Tobi,

im Modelmaker kann ich bestimmte Pattern auf Klassen anwenden, u.a. das Singleton-Pattern, welches folgendermassen implemetiert wird:
Delphi-Quellcode:
unit Singleton;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs;

type
  TSingleton = class(TObject)
  protected
    constructor CreateInstance;
    class function AccessInstance(Request: Integer): TSingleton;
  public
    constructor Create;
    destructor Destroy; override;
    class function Instance: TSingleton;
    class procedure ReleaseInstance;
  end;


implementation

{
********************************** TSingleton **********************************
}
constructor TSingleton.Create;
begin
  inherited Create;
  raise Exception.CreateFmt('Access class %s through Instance only',
      [ClassName]);
end;

constructor TSingleton.CreateInstance;
begin
  inherited Create;
end;

destructor TSingleton.Destroy;
begin
  if AccessInstance(0) = Self then AccessInstance(2);
  inherited Destroy;
end;

class function TSingleton.AccessInstance(Request: Integer): TSingleton;

  {$WRITEABLECONST ON}
  const FInstance: TSingleton = nil;
  {$WRITEABLECONST OFF}

begin
  case Request of
    0 : ;
    1 : if not Assigned(FInstance) then FInstance := CreateInstance;
    2 : FInstance := nil;
  else
    raise Exception.CreateFmt('Illegal request %d in AccessInstance',
        [Request]);
  end;
  Result := FInstance;
end;

class function TSingleton.Instance: TSingleton;
begin
  Result := AccessInstance(1);
end;

class procedure TSingleton.ReleaseInstance;
begin
  AccessInstance(0).Free;
end;



end.
Ich arbeite immer mit diesem Ansatz und finde es klappt recht gut.

Hans.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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