Erstellen einer echten Singletonklasse in delphi


Der Artikel beschreibt wie Sie eine Klasse erstellen, die das Singletonmuster folgt. Klasse beschrieben wird die Singleton-Anforderungen kümmern und Effekte selbst effektiv verlassen des Programmierers um die Klasse verwenden wie jede andere.
Ein Singleton ist eine Klasse, die nur ein Objekt unterstützt. Es ist wie Ihr Computer - es gibt nur eine Tastatur. Also, wenn Sie Delphi Code, die Ihren Computer simuliert schreiben, sollten Sie nur eine Objektinstanz mit Tastatur Lese-, Schreib- und Kontrolltätigkeiten.
Artikel über Singleton-Klassen sind selten, aber es gibt ein paar im Internet. Ich habe einige in Zeitschriften zu sehen. Aber keiner von diesen Artikeln enthalten Beispielcode zum Erstellen einer echten Singletonklasse.
'Real' meine ich, dass die Klasse selbst die Forderung einer Instanz anstatt diese Aufgabe dem Programmierer erzwingt. Alle Artikel, die ich bisher gesehen habe haben benötigt die Programmierer mit der Klasse in besonderer Weise um das Singletonmuster zu erzwingen.
In diesem Artikel sehen Sie, wie man eine richtige Singleton-Klasse erstellen, die Logik zum Erzwingen der Regel eins-Instanz enthält.
Hinweis: Der konventionelle Ansatz, in dem die Regel eins-Instanz explizit durch den Programmierer betreut wird, ist nicht ohne Verdienst. Echte Singleton-Klassen wie die, die ich hier effektiv präsentieren ausblenden die Details und das Bewusstsein für das Singleton-Muster aus dem Programmierer. Der Programmierer ist erleichtert die Aufgabe zur Durchsetzung der Muster--die ist gut-- aber der Programmierer kann auch nichts von der Besonderheit der Klasse, das ist schlecht. Wenn Sie nicht wissen, dass die Klasse eine Singleton-Klasse können alle möglichen Fehler auftauchen. Sie sind gewarnt worden!
Schreiben von code
Unser Ziel ist es, eine Klasse zu schreiben, die wie folgt verwendet werden kann:

Test des Verfahrens;
var
S1, s2: TSingleton;
beginnen
S1: = TSingleton.Create;
S2: = TSingleton.Create;
Tun Sie etwas mit s1 und s2 hier
S2. Frei;
S1. Frei;
Ende;


(Ich habe die Try... endlich Blöcke und andere Schutzmaßnahmen der Einfachheit halber ausgelassen.)
Das Ziel ist, machen die TSingleton-Klasse so zu Verhalten, dass s1 und s2 auf dasselbe Objekt verweisen. Hier ist, was wir zu tun haben:


  • Instanziieren des Objekts beim erstmaligen Erstellen aufgerufen wird (wenn s1 oben erstellt wird)
  • Stellen Sie sicher, dass beim Erstellen einer anderen ausgeführten (s2 oben) ist, das vorhandene Objekt anstelle einer anderen erstellt wiederverwendet wird
  • Zu vermeiden, das Objekt zu zerstören, wenn es nicht die letzte Referenz, die zerstört wird ist (wenn s2 freigegeben wird)
  • Zerstören Sie die Instanz, wenn der letzte Verweis zerstört wird (wenn s1 oben freigegeben wird)


Gibt es eine Möglichkeit, die Erstellung und Zerstörung eines neuen Objekts in Delphi zu überschreiben? Es ist sicher. In der Klasse TObject (die Mutter aller Objekte {Wortspiel}) gibt es zwei Methoden, die wir verwenden können:

Klasse Funktion NewInstance: TObject; virtuellen;
Prozedur FreeInstance; virtuellen;


NewInstance ist verantwortlich für die Zuteilung von Speicher, um eine neue Instanz der Klasse zu halten, und FreeInstance ist verantwortlich für das, dass der Speicher freigeben, wenn die Klasse über mit ihm ist.
Diese Methoden bestimmen, was passiert, wenn das Objekt erstellt wird und wenn das Objekt zerstört wird. Wenn wir diesen Code überschreiben, können wir Änderung des Standardverhaltens um das sagen zu arbeiten erfordert eine Singleton-Klasse. Nichts, um es.
Tracking-Instanzen ist ein wenig komplizierter. Wir müssen:


  1. Halten Sie den Überblick über jedes vorhandene Instanz der Klasse
  2. Halten Sie den Überblick über wie viele Verweise auf diese Instanz gibt es
  3. Ein neues Objekt zu erstellen, nur, wenn keine Instanz vorhanden ist
  4. Das Objekt zu zerstören, wenn der letzte Verweis entfernt wird


Zu verfolgen eine vorhandene Instanz, benutzen wir eine globale Variable. Eigentlich wird die Variable letztlich erklärt im Implementierungsteil einer Einheit so dass es eine echte globale Variable nicht. Aber der Anwendungsbereich muss ausreichen, um alle erstellen und kostenlos telefonieren zu verfolgen. Wir werden die Instanz-Variable nennen, damit wir wissen, was es sich bezieht.
Wie für die Verfolgung von wie viele Verweise vorhanden sind, brauchen wir eine andere Variable. Wir können es innerhalb der Klasse oder machen eine Art of global wie Instanz. Ich werde entscheiden sich für die letztere Möglichkeit aber nicht was du fühlst ist am besten. Ich nenne diese Variable Ref_Count.
Wir haben jetzt zwei Variablen:

var
Instanz: TSingleton = Nil;
Ref_Count: Integer = 0;


Ich initialisieren die Variablen, so dass zunächst sie keinen Müll enthalten. Ich weiß, dass der Compiler dies automatisch tut, so ist dies nur eine Frage der Lesbarkeit.
Wir müssen die TSingleton-Klasse über die Variable Block deklarieren, und wenn Sie sich die Beispieldateien ansehen können Sie herunterladen, am Ende dieses Artikels, die Sie sehen, dass ich die Erklärung in den Interface-Teil der Unit, habe, so dass es außerhalb davon sichtbar ist.

Hier ist die Deklaration der Klasse TSingleton:

Typ
TSingleton = Klasse
öffentliche
Klasse Funktion NewInstance: TObject; außer Kraft setzen;
Prozedur FreeInstance; außer Kraft setzen;
Klasse Funktion RefCount: Integer;
Ende;


Ich habe die RefCount-Funktion, damit wir sehen können, dass es tatsächlich funktioniert, und es häufig nützlich ist zu lesen wie viele Verweise auf das Objekt vorhanden sind. Es ist jedoch nicht erforderlich damit Sie nicht es zu Ihren Singleton-Klassen hinzufügen, wenn Sie es nicht brauchen.
OK, jetzt für die Durchführung der drei Methoden:

Prozedur TSingleton.FreeInstance;
beginnen
Dec (Ref_Count);
Wenn (Ref_Count = 0) dann
beginnen
Instanz: = Nil;
Private Variablen hier zu zerstören
geerbte FreeInstance;
Ende;
Ende;
Klasse Funktion TSingleton.NewInstance: TObject;
beginnen
Wenn (nicht zugewiesen (Instanz)) dann
beginnen
Instanz: = geerbte NewInstance;
Initialisieren Sie private Variablen hier wie folgt:
TSingleton(Result). Variable: = Value;
Ende;
Ergebnis: = Instanz
Inc (Ref_Count);
Ende;
Klasse Funktion TSingleton.RefCount: Integer;
beginnen
Ergebnis: = Ref_Count;
Ende;


Und das war's!
Wenn Sie TSingletons Konstruktor aufrufen, wird ein Aufruf an die NewInstance Methode deklariert in TObject platziert. Diese Methode reserviert Speicher um das neue Objekt zu halten und gibt es an den Konstruktor. Der Konstruktor verwendet, dass Speicher und schließlich gibt einen Zeiger auf den Speicher der Code, den Konstruktor aufgerufen. Dieser Zeiger wird normalerweise in einer Variablen gespeichert, während das Objekt verwendet wird.
Ich habe die NewInstance-Methode überschrieben, so dass es Speicher reserviert werden wird, nur dann, wenn keine Instanz der Klasse vorhanden ist. Wenn eine Instanz vorhanden ist, gibt die Funktion einfach diese Instanz an den Konstruktor, so dass es wiederverwendet wird.
Wenn wir dreimal den Konstruktor aufrufen, wird ein Objekt nur beim ersten Mal erstellt. Die anderen zwei Anrufe einfach wiederverwenden das erste Objekt. Die Referenz-Zählvariable ließ uns wissen, dass wir drei Verweise auf die einzelne Instanz.
Wenn das Programm den Destruktor aufruft, wird ein Aufruf von FreeInstance platziert, um im Konstruktor reservierten Speicher freizugeben. Diese Methode wird auch überschrieben, so dass das Objekt zerstört wird, nur dann, wenn der letzte Verweis entfernt wird.
Wenn Sie einen Singleton in einem Multithread-Programm verwenden möchten, behandeln Sie das Objekt wie eine beliebige Variable können Sie zwischen Threads zu teilen. Denn das ist genau das, was Sie tun: zwischen Threads zu teilen. Also müssen Sie besonders darauf achten, beim Ändern von Daten.
Einfachheit, selbst
Wie Sie sehen können, erforderlich erstellen eine Singleton-Klasse nicht viel Aufwand, nur mit dem richtigen Wissen und ein paar Zeilen Code. Mein Code funktioniert in Delphi 5. Die Technik wird wahrscheinlich funktionieren mit älteren Versionen von Delphi, aber ich habe es nicht getestet, so dass ich keine Garantien machen.
Bevor ich Ihnen die Datei zu spielen geben, ich gebe Ihnen ein paar Worte der Warnung.


  • Nicht von einer Singletonklasse absteigen. Der Grund dafür ist, dass es nur eine Instanz und Referenz-Zählvariable. Wenn Sie zwei Klassen von TSingleton ableiten, wird nur ein Objekt erstellt. Die andere Klasse verwendet das Objekt erneut eine Instanz einer anderen Klasse sein wird. Gehen Sie nicht auf diesem Weg!
  • Sie können keine Singleton-Komponenten aus dem einfachen Grund Eigentum vornehmen. Eine Komponente ist im Besitz von einem Formular und einer Komponente kann nicht im Besitz mehrere andere Komponenten.
  • Denken Sie daran, dass der Konstruktor und Destruktor für jeden neuen Verweis aufgerufen, wie sie erstellt und zerstört sind. Nicht private Variablen im Konstruktor initialisieren und nicht im Destruktor befreien. Stattdessen bauen Sie, dass Code in die NewInstance sowie die FreeInstance-Methode, wie in den Kommentaren dargestellt.
  • Die Reihenfolge der Ref_Count in den zwei Methoden in Verbindung mit dem Rest des Codes in diese beiden Methoden anpassen ist entscheidend. Es hat zu tun mit ordnungsgemäßen Erstellung und Zerstörung, wenn etwas schief geht. Wenn die Initialisierungscode eine Ausnahme auslöst, die Reihenfolge der Dinge zu tun wie oben gezeigt wird stellen Sie sicher, dass die Klasse richtig zerstört wird. Ändern Sie diesen Code auf eigene Gefahr!
    Die Datei, die Sie herunterladen können, ist lediglich eine Kopie der Einheit, die in diesem Artikel beschriebene Singletonklasse deklariert.
    Link zur Datei: CodeCentral Eintrag 15083.
    Ich bin sicher, dass Sie finden ein paar Orte, wo eine Singleton-Klasse ist praktisch und jetzt hast du die Werkzeuge, um eigene erstellen! Wenn Sie mit mir Kontakt aufnehmen möchten, ist meine e-Mail [email protected]
    Glücklich-Programmierung!









Erstellen einer echten Singletonklasse in delphi


Erstellen einer echten Singletonklasse in delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Der Artikel beschreibt wie Sie eine Klasse erstellen, die das Singletonmuster folgt. Klasse beschrieben wird die Singleton-Anforderungen kümmern und Effekte selbst effektiv verlassen des Programmierers um die Klasse verwenden wie jede andere.
Ein Singleton ist eine Klasse, die nur ein Objekt unterstützt. Es ist wie Ihr Computer - es gibt nur eine Tastatur. Also, wenn Sie Delphi Code, die Ihren Computer simuliert schreiben, sollten Sie nur eine Objektinstanz mit Tastatur Lese-, Schreib- und Kontrolltätigkeiten.
Artikel über Singleton-Klassen sind selten, aber es gibt ein paar im Internet. Ich habe einige in Zeitschriften zu sehen. Aber keiner von diesen Artikeln enthalten Beispielcode zum Erstellen einer echten Singletonklasse.
'Real' meine ich, dass die Klasse selbst die Forderung einer Instanz anstatt diese Aufgabe dem Programmierer erzwingt. Alle Artikel, die ich bisher gesehen habe haben benötigt die Programmierer mit der Klasse in besonderer Weise um das Singletonmuster zu erzwingen.
In diesem Artikel sehen Sie, wie man eine richtige Singleton-Klasse erstellen, die Logik zum Erzwingen der Regel eins-Instanz enthält.
Hinweis: Der konventionelle Ansatz, in dem die Regel eins-Instanz explizit durch den Programmierer betreut wird, ist nicht ohne Verdienst. Echte Singleton-Klassen wie die, die ich hier effektiv präsentieren ausblenden die Details und das Bewusstsein für das Singleton-Muster aus dem Programmierer. Der Programmierer ist erleichtert die Aufgabe zur Durchsetzung der Muster--die ist gut-- aber der Programmierer kann auch nichts von der Besonderheit der Klasse, das ist schlecht. Wenn Sie nicht wissen, dass die Klasse eine Singleton-Klasse können alle möglichen Fehler auftauchen. Sie sind gewarnt worden!
Schreiben von code
Unser Ziel ist es, eine Klasse zu schreiben, die wie folgt verwendet werden kann:

Test des Verfahrens;
var
S1, s2: TSingleton;
beginnen
S1: = TSingleton.Create;
S2: = TSingleton.Create;
Tun Sie etwas mit s1 und s2 hier
S2. Frei;
S1. Frei;
Ende;


(Ich habe die Try... endlich Blöcke und andere Schutzmaßnahmen der Einfachheit halber ausgelassen.)
Das Ziel ist, machen die TSingleton-Klasse so zu Verhalten, dass s1 und s2 auf dasselbe Objekt verweisen. Hier ist, was wir zu tun haben:


  • Instanziieren des Objekts beim erstmaligen Erstellen aufgerufen wird (wenn s1 oben erstellt wird)
  • Stellen Sie sicher, dass beim Erstellen einer anderen ausgeführten (s2 oben) ist, das vorhandene Objekt anstelle einer anderen erstellt wiederverwendet wird
  • Zu vermeiden, das Objekt zu zerstören, wenn es nicht die letzte Referenz, die zerstört wird ist (wenn s2 freigegeben wird)
  • Zerstören Sie die Instanz, wenn der letzte Verweis zerstört wird (wenn s1 oben freigegeben wird)


Gibt es eine Möglichkeit, die Erstellung und Zerstörung eines neuen Objekts in Delphi zu überschreiben? Es ist sicher. In der Klasse TObject (die Mutter aller Objekte {Wortspiel}) gibt es zwei Methoden, die wir verwenden können:

Klasse Funktion NewInstance: TObject; virtuellen;
Prozedur FreeInstance; virtuellen;


NewInstance ist verantwortlich für die Zuteilung von Speicher, um eine neue Instanz der Klasse zu halten, und FreeInstance ist verantwortlich für das, dass der Speicher freigeben, wenn die Klasse über mit ihm ist.
Diese Methoden bestimmen, was passiert, wenn das Objekt erstellt wird und wenn das Objekt zerstört wird. Wenn wir diesen Code überschreiben, können wir Änderung des Standardverhaltens um das sagen zu arbeiten erfordert eine Singleton-Klasse. Nichts, um es.
Tracking-Instanzen ist ein wenig komplizierter. Wir müssen:


  1. Halten Sie den Überblick über jedes vorhandene Instanz der Klasse
  2. Halten Sie den Überblick über wie viele Verweise auf diese Instanz gibt es
  3. Ein neues Objekt zu erstellen, nur, wenn keine Instanz vorhanden ist
  4. Das Objekt zu zerstören, wenn der letzte Verweis entfernt wird


Zu verfolgen eine vorhandene Instanz, benutzen wir eine globale Variable. Eigentlich wird die Variable letztlich erklärt im Implementierungsteil einer Einheit so dass es eine echte globale Variable nicht. Aber der Anwendungsbereich muss ausreichen, um alle erstellen und kostenlos telefonieren zu verfolgen. Wir werden die Instanz-Variable nennen, damit wir wissen, was es sich bezieht.
Wie für die Verfolgung von wie viele Verweise vorhanden sind, brauchen wir eine andere Variable. Wir können es innerhalb der Klasse oder machen eine Art of global wie Instanz. Ich werde entscheiden sich für die letztere Möglichkeit aber nicht was du fühlst ist am besten. Ich nenne diese Variable Ref_Count.
Wir haben jetzt zwei Variablen:

var
Instanz: TSingleton = Nil;
Ref_Count: Integer = 0;


Ich initialisieren die Variablen, so dass zunächst sie keinen Müll enthalten. Ich weiß, dass der Compiler dies automatisch tut, so ist dies nur eine Frage der Lesbarkeit.
Wir müssen die TSingleton-Klasse über die Variable Block deklarieren, und wenn Sie sich die Beispieldateien ansehen können Sie herunterladen, am Ende dieses Artikels, die Sie sehen, dass ich die Erklärung in den Interface-Teil der Unit, habe, so dass es außerhalb davon sichtbar ist.

Hier ist die Deklaration der Klasse TSingleton:

Typ
TSingleton = Klasse
öffentliche
Klasse Funktion NewInstance: TObject; außer Kraft setzen;
Prozedur FreeInstance; außer Kraft setzen;
Klasse Funktion RefCount: Integer;
Ende;


Ich habe die RefCount-Funktion, damit wir sehen können, dass es tatsächlich funktioniert, und es häufig nützlich ist zu lesen wie viele Verweise auf das Objekt vorhanden sind. Es ist jedoch nicht erforderlich damit Sie nicht es zu Ihren Singleton-Klassen hinzufügen, wenn Sie es nicht brauchen.
OK, jetzt für die Durchführung der drei Methoden:

Prozedur TSingleton.FreeInstance;
beginnen
Dec (Ref_Count);
Wenn (Ref_Count = 0) dann
beginnen
Instanz: = Nil;
Private Variablen hier zu zerstören
geerbte FreeInstance;
Ende;
Ende;
Klasse Funktion TSingleton.NewInstance: TObject;
beginnen
Wenn (nicht zugewiesen (Instanz)) dann
beginnen
Instanz: = geerbte NewInstance;
Initialisieren Sie private Variablen hier wie folgt:
TSingleton(Result). Variable: = Value;
Ende;
Ergebnis: = Instanz
Inc (Ref_Count);
Ende;
Klasse Funktion TSingleton.RefCount: Integer;
beginnen
Ergebnis: = Ref_Count;
Ende;


Und das war's!
Wenn Sie TSingletons Konstruktor aufrufen, wird ein Aufruf an die NewInstance Methode deklariert in TObject platziert. Diese Methode reserviert Speicher um das neue Objekt zu halten und gibt es an den Konstruktor. Der Konstruktor verwendet, dass Speicher und schließlich gibt einen Zeiger auf den Speicher der Code, den Konstruktor aufgerufen. Dieser Zeiger wird normalerweise in einer Variablen gespeichert, während das Objekt verwendet wird.
Ich habe die NewInstance-Methode überschrieben, so dass es Speicher reserviert werden wird, nur dann, wenn keine Instanz der Klasse vorhanden ist. Wenn eine Instanz vorhanden ist, gibt die Funktion einfach diese Instanz an den Konstruktor, so dass es wiederverwendet wird.
Wenn wir dreimal den Konstruktor aufrufen, wird ein Objekt nur beim ersten Mal erstellt. Die anderen zwei Anrufe einfach wiederverwenden das erste Objekt. Die Referenz-Zählvariable ließ uns wissen, dass wir drei Verweise auf die einzelne Instanz.
Wenn das Programm den Destruktor aufruft, wird ein Aufruf von FreeInstance platziert, um im Konstruktor reservierten Speicher freizugeben. Diese Methode wird auch überschrieben, so dass das Objekt zerstört wird, nur dann, wenn der letzte Verweis entfernt wird.
Wenn Sie einen Singleton in einem Multithread-Programm verwenden möchten, behandeln Sie das Objekt wie eine beliebige Variable können Sie zwischen Threads zu teilen. Denn das ist genau das, was Sie tun: zwischen Threads zu teilen. Also müssen Sie besonders darauf achten, beim Ändern von Daten.
Einfachheit, selbst
Wie Sie sehen können, erforderlich erstellen eine Singleton-Klasse nicht viel Aufwand, nur mit dem richtigen Wissen und ein paar Zeilen Code. Mein Code funktioniert in Delphi 5. Die Technik wird wahrscheinlich funktionieren mit älteren Versionen von Delphi, aber ich habe es nicht getestet, so dass ich keine Garantien machen.
Bevor ich Ihnen die Datei zu spielen geben, ich gebe Ihnen ein paar Worte der Warnung.


  • Nicht von einer Singletonklasse absteigen. Der Grund dafür ist, dass es nur eine Instanz und Referenz-Zählvariable. Wenn Sie zwei Klassen von TSingleton ableiten, wird nur ein Objekt erstellt. Die andere Klasse verwendet das Objekt erneut eine Instanz einer anderen Klasse sein wird. Gehen Sie nicht auf diesem Weg!
  • Sie können keine Singleton-Komponenten aus dem einfachen Grund Eigentum vornehmen. Eine Komponente ist im Besitz von einem Formular und einer Komponente kann nicht im Besitz mehrere andere Komponenten.
  • Denken Sie daran, dass der Konstruktor und Destruktor für jeden neuen Verweis aufgerufen, wie sie erstellt und zerstört sind. Nicht private Variablen im Konstruktor initialisieren und nicht im Destruktor befreien. Stattdessen bauen Sie, dass Code in die NewInstance sowie die FreeInstance-Methode, wie in den Kommentaren dargestellt.
  • Die Reihenfolge der Ref_Count in den zwei Methoden in Verbindung mit dem Rest des Codes in diese beiden Methoden anpassen ist entscheidend. Es hat zu tun mit ordnungsgemäßen Erstellung und Zerstörung, wenn etwas schief geht. Wenn die Initialisierungscode eine Ausnahme auslöst, die Reihenfolge der Dinge zu tun wie oben gezeigt wird stellen Sie sicher, dass die Klasse richtig zerstört wird. Ändern Sie diesen Code auf eigene Gefahr!
    Die Datei, die Sie herunterladen können, ist lediglich eine Kopie der Einheit, die in diesem Artikel beschriebene Singletonklasse deklariert.
    Link zur Datei: CodeCentral Eintrag 15083.
    Ich bin sicher, dass Sie finden ein paar Orte, wo eine Singleton-Klasse ist praktisch und jetzt hast du die Werkzeuge, um eigene erstellen! Wenn Sie mit mir Kontakt aufnehmen möchten, ist meine e-Mail [email protected]
    Glücklich-Programmierung!


Erstellen einer echten Singletonklasse in delphi

Erstellen einer echten Singletonklasse in delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Erstellen einer echten Singletonklasse in delphi
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung