Announcement

Collapse
No announcement yet.

Singleton Pattern in Delphi 5

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Singleton Pattern in Delphi 5

    Hallo

    Gibt es eine Referenzimplementierung (Beispiele) des Singleton Pattern für Delphi 5 bzw. habt ihr Tipps wie man dieses Pattern in Delphi hinbekommt?

    Ich wollte eine Klasse, die das Singelton Pattern in C++ implementiert in Delphi übersetzen, scheitere aber an den Funktionsdeklarationen static und den inline funktionen. (wobei die inline funktion ja noch nicht mal so schlimm ist)

    Grüße
    Daimonion

  • #2
    Hallo!

    So löst das der Modelmaker:

    unit Unit1;

    interface

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

    implementation

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

    constructor TMySingleton.CreateInstance;
    begin
    inherited Create;
    end;

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

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

    const FInstance: TMySingleton = nil;

    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 TMySingleton.Instance: TMySingleton;
    begin
    Result := AccessInstance(1);
    end;

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

    end.

    ist übrigens zu finden unter:
    http://www.modelmakertools.com/

    BYE BERND

    Comment


    • #3
      Danke. Ah, okay im Endeffekt macht der Modelmaker das schon irgendwie so wie ich mir das dachte.

      Danke für die Hilfe.

      Grüße
      Daimonion

      Comment


      • #4
        Also, Ich will den Beitrag nochmal derart abrunden, dass ich poste wie ich das jetzt gelöst habe.

        Ich konnte es nochmal vereinfachen und so sieht der Code bei mir momentan aus.

        Code:
        unit Sprache;
        
        interface
        uses Classes;
        
        type
        
            TSprache = Class
            private
                  constructor Create;
            public
                  class function getInstance: TSprache;
                  function test: integer;
        
            end;
        
        
        
        implementation
        
        
        constructor TSprache.Create;
        
        begin
             inherited Create;
        end;
        
        class function TSprache.getInstance: TSprache;
        
           const Instance : TSprache = nil;
        
        begin
             if not Assigned(Instance) then Instance := Create;
             Result := Instance;
        end;
        
        function TSprache.test: integer;
        begin
            result:= 10;
        end;
        
        end.
        Dadurch bin ich momentan erst mal so weit, dass mir immer nur eine Instanz geladen wird.

        Der Aufruf der Methode Test lautet dann folgendermaßen:

        Code:
        i := TSprache.getInstance.test;
        Soweit so gut.

        Was nun noch schön wäre ist, dass ich das TSprache.getInstance ersetzen kann.

        Unter C++ konnte ich dafür einen Inline Funktion einsetzen die folgendermaßen aussieht.

        Code:
        inline Lang* lang() { return Lang::getInstance(); }
        Unter C++ liefert die Funktion bei Aufruf von

        Code:
        lang()->...
        den Pointer des Objektes zurück, was die Hanhabung erheblich vereinfacht.

        Ich bin mir sicher, dass es dafür auch in Delphi eine Möglichkeit gibt, nur leider bin ich bisher noch nicht drauf gekommen welche das ist. Könnt ihr mir da nochmal helfen?

        Grüße
        Daimonion

        Comment


        • #5
          Also ich habe das ganze mal über einen globale function() gelöst, was ich persönlich nicht so schön finde, aber ...

          Beispiel:

          function Lang: TSprache;
          begin
          Result := TSprache.getInstance;
          end;

          Dein Aufruf wäre dann:

          i := Lang.test;

          bye, Hans.

          Comment


          • #6
            @Hans

            Danke für den Hinweis. Ich werd es vorerst auch so machen. Was globale Funktionen allgemein und hier im speziellen angeht, bin ich auch deiner Meinung, dass es zwar nicht schon aber zweckoptimiert ist.


            Grüße
            Daimonion

            Comment

            Working...
            X