![]() |
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 |
Re: Design Paddern Singelton - Oder wie verstecke ich Create
Hallo,
so.
Delphi-Quellcode:
Aufruf erfolgt per CreateClass und zwar sooft du willst.
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; Es gibt auch den Ansatz, einfach per <>NIL zu prüfen, der gefällt mir aber nicht so. Heiko |
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:
Ich arbeite immer mit diesem Ansatz und finde es klappt recht gut.
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. Hans. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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