Fabrik-Muster für Menüfunktionen


In diesem Artikel Presse I die Fabrik in Betrieb für Menüfunktionen.
Werden Sie wird serviert?
In diesem Artikel nehmen wir eine kurze Pause von den Anstrengungen der Implementierung von Business-Objekten, mit etwas umzugehen, die fast jede Anwendung benötigt: ein Menü. Kein Menü im Sinne eines Derivats TMainMenu aber eher eine Art von Front-End-das zeigt einer Reihe von Optionen zur Verfügung und erfordert eine vom Benutzer ausgewählt werden. Ein typisches Beispiel wäre eine Liste von Optionen, die dem Benutzer beim Starten einer Anwendung dargestellt: sie sind erforderlich, ob die Hauptanwendung starten soll, oder vielleicht das reporting-Paket, allgemeine Dienstprogramme oder Admin-Systeme. Diese Optionen sind in der Regel ziemlich plumpe Weise, vielleicht ein kleines Formular mit einer Reihe von Schaltflächen mit Beschriftung, beschreibt die Anwendung ausgeführt werden oder ein Listenfeld mit einer Anzahl von Einträgen für den Benutzer angezeigt. Am häufigsten dieser Menütyp Formen sind hart codiert und intrinsisch 'wissen' wie die ausgewählte Option gestartet. Solche Lösungen haben zwei Eigenschaften: sie sind unflexibel und unattraktiv. In diesem Monat verwenden wir die Fabrik (und vernünftige Wahl der visuellen Komponente) eine bessere Lösung.
Zur Arbeit zu gehen
Ein Factorymuster sollte verwendet werden, wenn 'eine Klasse Klasse von Objekten, die sie erstellen, muss noch nicht'. Im Wesentlichen ein Clientobjekt verwendet die Eigenschaften und Methoden eines Objekts abstrakte Vorfahren in der Tat, dass es konkrete Nachfahren manipulieren ist, die von der Klassenfactory geliefert worden sind. Der Schlüssel für die Gestaltung ist, dass der Kunde nicht braucht keine spezifische Details über die eigentlichen Objekte kennen, die sie manipulieren ist, mit Ausnahme derjenigen, die sie in dem gemeinsamen Vorfahren teilen. Das entkoppelt effektiv solche Klassen zur Kompilierzeit. In Bezug auf unsere erforderlich Menübild in Delphi bedeutet dies, dass das Formular im Menü nicht braucht, die Einheiten verwenden, die enthalten die Formulare angezeigt werden, wenn ein bestimmtes Menüelement ausgewählt ist. Diese Eleganz bietet uns die Möglichkeit solche Formen innerhalb der DLL zu platzieren, die dynamisch geladen werden, wenn die Verwendung den entsprechenden Menüpunkt auswählt. Dies hat die offensichtlichen Vorteilen der Speicherverbrauch (nur die Menüoption, die aktiv vom Benutzer zur Laufzeit ausgewählt verbraucht Speicher), und dass die Anwendung erweitert werden, kann indem Sie einfach eine neue DLL bereitstellen - der vorhandenen Menübildschirm einfach, es erkennen kann ist Präsenz und fügen Sie es der Liste für den Benutzer angezeigt.
Zunächst betrachten wir den Fall einer statisch gebundene Menge von Menüfunktionen; Das heißt, werden alle verfügbaren Vorgänge innerhalb der Anwendung kompiliert. Beachten Sie jedoch, dass dies einfach eine Bequemlichkeit; der Menübildschirm selbst hat noch kein explizites Wissen über die verfügbaren Vorgänge oder wie sie in der Anwendung verknüpft sind. Stattdessen jede Menübedienung registriert sich selbst mit dem Werk und die Menü-Form wird die Fabrik für die verfügbaren Einträge zu verhören. Das Menü-Formular ist dann frei, diese Einträge in irgendeiner Weise zu präsentieren, wie es für hält richtig. Wenn der Benutzer einen Eintrag auswählt, die Fabrik wird gebeten, eine konkrete Instanz des speziellen zu konstruieren und dies wird dann angezeigt.
Die Fabrik selbst hat eine sehr einfache Schnittstelle. Es hat eine Methode namens Register, die durch die Menüeinträge selbst verwendet wird, um das Werk ihrer Existenz zu informieren (Ich habe Register verwendet wie es die Nomenklatur verwendet imitiert durch andere Fabriken in Delphi selbst, wie die Registrierung von Komponenten für die Anzeige in der Palette 'Komponente'). Darüber hinaus hat die Fabrik zwei Eigenschaften, die eine andere Klasse, die Anzahl der Mitglieder innerhalb der Fabrik zu beobachten, und ermöglicht den Zugriff auf jedes. Listing 1 zeigt eine vollständige Implementierung für diese Fabrik.
Wir müssen jetzt einige Menüfunktionen die Fabrik hinzu. Dies ist sehr einfach: einige neue Formulare erstellen, die Klausel verwendet im Abschnitt über die Implementierung der MenuActionFactory-Einheit hinzu, und fügen Sie jede Form-Einheit wird im folgenden code an den Fuss:
Initialisierung
MenuActions.Register (TMyNewForm);
Die TMyNewForm-Referenz sollte mit dem Klassennamen der bestimmten Form für das fragliche Gerät ersetzt werden. Nun, da unsere Klassenfactory initialisiert wurde, können wir unseren Geist, wie es angewendet werden kann wenden.
A la Carte Menüs
Als zuvor beobachteten sind viele 'offensichtliche' Möglichkeiten, dass sich der Benutzer um eine Wahl von vielen visuell ansprechend. Eine vertikale Liste der große Tasten (mit langen Beschriftungen) ist eine besonders unattraktiv, aber überraschend gemeinsame Lösung. Betrachten Sie, wie Windows ein ähnliches Benutzer Schnittstelle Problem löst: das Control Panel ist ein gutes Beispiel für eine Liste der unterschiedlichen Vorgänge. Dies ist nichts anderes als eine Listenansicht, aber eine Reihe von gut gestalteten Icons und einheitliches Layout geht einen langen Weg um eine attraktive Schnittstelle. Dazu kommt die eingebaute Fähigkeit einer Listenansicht, die Ikonen neu zu ordnen, es angepasst wird und Symbole der verschiedenen Größen oder einer aussagekräftigeren Berichtsansicht angezeigt, und Sie haben eine fast ideale Auswahl-Werkzeug.
Um einen neuen Menübildschirm erstellen, Löschen einer Listenansicht auf ein leeres Formular, und richten Sie es auf den Clientbereich. Möchte ich lassen eine TCoolBar oben ausgerichtet auf das Formular und fügen ein paar flache Tasten (mit Bildern aus dem Explorer Riss) erlauben den Benutzer, die ViewStyle der Listenansicht ändern. Damit wird die Listenansicht, die Symbole automatisch anordnen, fügen Sie den folgenden Code an das FormResize-Ereignis:
lvwForms.Arrange (ArDefault);
Schließlich müssen wir die Form einer Bildliste hinzu, und verknüpfen Sie es mit der Listenansicht LargeImages-Eigenschaft.
Wir müssen jetzt die Optionen des Menüs innerhalb der Fabrik in der Listenansicht angezeigt. Dazu gehört mit dem Fahrrad durch die registrierte Menüoptionen und erstellen ein neues Listenelement für jeden. Jedes Listenelement einen Bildindex für ihr Symbol und Beschriftung zugewiesen werden müssen - dies direkt aus den gleichen benannten Eigenschaften von registrierten Form getroffen werden. Es ist möglich, weitere Informationen zu den Menüpunkten für die Instanz hinzufügen, wenn die Listenansicht im VsReport Modus befindet; Es kann sein, dass eine gute Idee, eine lange Beschreibung als zweite Spalte angezeigt, sodass unerfahrene Nutzer ein besseres Verständnis erhalten, was bedeutet jede Aktion hinzufügen. Ein gutes Beispiel dafür sehen in der Management-Konsole von Windows 2000.
Der Schlüssel zu diesem Prozess ist, dass die Menü-Präsentationsformat selbst nur dem MenuActionFactory-Gerät selbst und keiner bestimmten Menü Option Formulare verwenden muss. Diese Spezialisierungen sind vollständig in die Fabrik versteckt; wie ihr Name andeutet, erstellt er eine konkrete Klasse den richtigen Typ ohne Client jemals benötigen, um die genauen Details wissen.

Listing 2 zeigt den Code erforderlich, um die Listenansicht zu füllen. Beachten Sie, dass wie es jeder registrierte Menüaktion durchläuft, die Fabrik die erforderliche Klasse erstellt. Das Menü-Formular erstellt dann ein neues Listenelement mit relevanten Informationen vor dem Zerstören des Objekts. Beachten Sie, dass damit dies ordnungsgemäß funktioniert die Konstruktoren auf den eingetragenen Klassen virtuell sein müssen; Dies gilt bereits für visuelle Komponenten wie Formen (weil Delphi eine Fabrik verwendet, um sie zu erstellen, wie sie in aus gestreamt werden. DFM-Dateien und Ressourcen), aber für benutzerdefinierte Klassen gilt es, einen virtuellen Konstruktor in ihrer Klassenhierarchie einzuführen.
Wenn dieses Formular für den Benutzer dargestellt ist und wird durch einen Doppelklick auf ein Element ausgewählt, dann Fragen wir wieder unsere Fabrik erforderliche spezifische Form erstellen können, können die dann angezeigt werden. Es gibt absolut keine Einschränkungen über die Möglichkeiten dieser Formen, aber die Eleganz des Musters Fabrik ist, dass der Client der Fabrik im Detail unwissend bleiben kann. Weitere Menü-Optionen hinzugefügt werden können ein sich entwickelndes System einfach durch ein neues Formular erstellen und registrieren mit der Fabrik - sie werden sofort hinzugefügt werden in das Menüsystem das nächste Mal, wenn, das die Anwendung ausgeführt wird. Diese mangelnde Kopplung zwischen den Elementen des Systems erheblich erleichtert Anwendungswartung für Großprojekte - einfach durch die Registrierung von Klassen mit einer Fabrik der Entwickler weiß, dass jeder Teil der Anwendung, die ein Interesse an solchen Dingen hat aktualisiert wird.
Es ist leicht zu sehen, wie diese Menü-Lösung an sich generisch ist und kann auf eine Reihe von Anwendungen angewendet werden oder sogar der gleichen Anwendung eine Anzahl von Zeiten. Ich habe in vielen meiner Anwendungen ein Hauptmenü, in dem alle wichtigen Module innerhalb der Suite, zwei solche Module, die Berichterstattung wird angezeigt und allgemeine Dienstprogramme. Wenn diese bestimmte Module ausgewählt werden sie wiederum ein weiteres Menü Berichte zeigen und Dienstprogramme zu präsentieren bzw. innerhalb des Systems. Dieser Menü-Formen gemeinsamen durch visuelle Formularvererbung, unterscheiden nur in der Fabrik, die sie verwenden (es gibt verschiedene Fabriken für Module, Berichte und Dienstprogramme). Der Vorgänger des visuellen Form geteilt durch alle drei kann sehr funktionell, die Anwendung für jede Menüoption dynamisch TMenuItem Einträge hinzufügen. Das Schlüsselwort hier ist die Wiederverwendung von Code durch lose Kopplung - ein wesentlicher Vorteil von objektorientierten Prinzipien. Im Vergleich dazu sieht der traditionelle Ansatz eng Kopplung einzigartiges Menü Formulare an ihre spezifischen Menüaktionen unflexibel und unhandlich.
Letzte Artikel-problem
Letzte Artikel wir diskutiert, wie ein Delegatobjekt bereitgestellt werden konnte, Business-Objekt-Informationen beibehalten werden, und wurde die Frage gestellt, wo könnte diese Bestimmung statt? Die offensichtliche Antwort auf die Frage ist das Verwaltungsobjekt Daten im Konstruktor des Business-Objekts zu erstellen:
Konstruktor TMyPDObject.Create;
beginnen
erbte;
Erforderlichen Informationen an den Konstruktor übergeben
DMObject: = TMyDMObject.Create;
Ende;
Das Problem bei diesem Ansatz ist, dass jedes Geschäftsobjekt erstellten wir den Aufwand für den Bau eines Verwaltungsobjekts Daten hat. Abhängig von Ihrer Datenbank, dies möglicherweise eine teure Operation, und somit äußerst unerwünscht, vor allem, wenn es, dass viele Business-Objekte gilt konstruiert und werden zerstört, wenn die Anwendung ausgeführt wird. Durch die Schnittstelle der Klasse untersuchen, können gesehen werden, dass die Load und Save-Methoden statusfrei sind-alle Arbeiten in der einzigen Methodenaufruf erreicht ist. Daher, sofern die Anwendung nicht Multithreaded Datenbankaktivitäten in gesonderten Teilen des des Problembereichs erfordert, kann ein einzelnes Datenobjekt Verwaltung unter anderem viele Instanzen der Business-Objekte freigegeben werden, die damit umgehen kann. Noch besser ist, dieses einem Datenobjekt Verwaltung kann auf Startzeit der Anwendung erstellt werden (oder zum ersten Mal ist es erforderlich). Diese Daten-Management-Objekte können als private globale Objekte innerhalb der Umsetzung des Problembereichs erstellt werden, oder eleganter, kann eine Fabrik verwendet werden, Daten-Management-Klassen mit Geschäftsklassen Objekt verknüpfen und diese entsprechend zu erstellen.
(((Listing 1 - eine Implementierung einer Fabrik für Menüfunktionen)))
Einheit MenuActionFactory;
Schnittstelle
verwendet
Klassen, Formen;
Typ
TMenuAction = TForm;
TMenuActionClass = Klasse von TMenuAction;
TMenuActionFactory = Klasse
Private
MenuActionList: TList;
Funktion GetCount: Integer;
Funktion GetMenuAction (Index: Integer): TMenuAction;
öffentliche
Konstruktor erstellen;
Destruktor Destroy; außer Kraft setzen;
Verfahren Register (MenuActionClass: TMenuActionClass);
Eigenschaft Count: Integer lesen GetCount;
Eigenschaft MenuAction [Index: Integer]: TMenuAction lesen GetMenuAction; in der Standardeinstellung;
Ende;
var
MenuActions: TMenuActionFactory;
Umsetzung
Konstruktor TMenuActionFactory.Create;
beginnen
erbte;
MenuActionList: = TList.Create;
Ende;
Destruktor TMenuActionFactory.Destroy;
beginnen
MenuActionList.Free;
erbte;
Ende;
Funktion TMenuActionFactory.GetCount: Integer;
beginnen
Ergebnis: = MenuActionList.Count;
Ende;
Funktion TMenuActionFactory.GetMenuAction (Index: Integer): TMenuAction;
beginnen
Assert ((Index > = 0) und (Index < Count), 'Index außerhalb des gültigen Bereichs.');
Konstruieren und den ausgewählten Eintrag zurück
Ergebnis: = TMenuActionClass (MenuActionList[Index]). Erstellen Sie (nil);
Ende;
Prozedur TMenuActionFactory.Register (MenuActionClass: TMenuActionClass);
beginnen
MenuActionList.Add (MenuActionClass);
Ende;
Initialisierung
MenuActions: = TMenuActionFactory.Create;
Finalisierung
MenuActions.Free;
Ende.
(((Ende Codebeispiel 1)))
(((Listing 2 - Verwenden einer Fabrik zum Auffüllen von einer Listenansicht)))
Prozedur PopulateListView (LvwMenu: TlistView; Fabrik: TMenuActionFactory);
var
Index: Integer;
MenuAction: TForm;
beginnen
für Index: = 0, Factory.Count - 1 fangen
MenuAction: = Factory.MenuAction[Index];
mit lvwMenu.Items.Add fangen
Bildunterschrift: = MenuAction.Caption;
ImageIndex: = lvwMenu.LargeImages.AddIcon (MenuAction.Icon);
SubItems.Add (MenuAction.Hint);
Ende;
Ende;
Ende;
(((Ende Codebeispiel 2)))
Weiter in Serie









Fabrik-Muster für Menüfunktionen


Fabrik-Muster für Menüfunktionen : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


In diesem Artikel Presse I die Fabrik in Betrieb für Menüfunktionen.
Werden Sie wird serviert?
In diesem Artikel nehmen wir eine kurze Pause von den Anstrengungen der Implementierung von Business-Objekten, mit etwas umzugehen, die fast jede Anwendung benötigt: ein Menü. Kein Menü im Sinne eines Derivats TMainMenu aber eher eine Art von Front-End-das zeigt einer Reihe von Optionen zur Verfügung und erfordert eine vom Benutzer ausgewählt werden. Ein typisches Beispiel wäre eine Liste von Optionen, die dem Benutzer beim Starten einer Anwendung dargestellt: sie sind erforderlich, ob die Hauptanwendung starten soll, oder vielleicht das reporting-Paket, allgemeine Dienstprogramme oder Admin-Systeme. Diese Optionen sind in der Regel ziemlich plumpe Weise, vielleicht ein kleines Formular mit einer Reihe von Schaltflächen mit Beschriftung, beschreibt die Anwendung ausgeführt werden oder ein Listenfeld mit einer Anzahl von Einträgen für den Benutzer angezeigt. Am häufigsten dieser Menütyp Formen sind hart codiert und intrinsisch 'wissen' wie die ausgewählte Option gestartet. Solche Lösungen haben zwei Eigenschaften: sie sind unflexibel und unattraktiv. In diesem Monat verwenden wir die Fabrik (und vernünftige Wahl der visuellen Komponente) eine bessere Lösung.
Zur Arbeit zu gehen
Ein Factorymuster sollte verwendet werden, wenn 'eine Klasse Klasse von Objekten, die sie erstellen, muss noch nicht'. Im Wesentlichen ein Clientobjekt verwendet die Eigenschaften und Methoden eines Objekts abstrakte Vorfahren in der Tat, dass es konkrete Nachfahren manipulieren ist, die von der Klassenfactory geliefert worden sind. Der Schlüssel für die Gestaltung ist, dass der Kunde nicht braucht keine spezifische Details über die eigentlichen Objekte kennen, die sie manipulieren ist, mit Ausnahme derjenigen, die sie in dem gemeinsamen Vorfahren teilen. Das entkoppelt effektiv solche Klassen zur Kompilierzeit. In Bezug auf unsere erforderlich Menübild in Delphi bedeutet dies, dass das Formular im Menü nicht braucht, die Einheiten verwenden, die enthalten die Formulare angezeigt werden, wenn ein bestimmtes Menüelement ausgewählt ist. Diese Eleganz bietet uns die Möglichkeit solche Formen innerhalb der DLL zu platzieren, die dynamisch geladen werden, wenn die Verwendung den entsprechenden Menüpunkt auswählt. Dies hat die offensichtlichen Vorteilen der Speicherverbrauch (nur die Menüoption, die aktiv vom Benutzer zur Laufzeit ausgewählt verbraucht Speicher), und dass die Anwendung erweitert werden, kann indem Sie einfach eine neue DLL bereitstellen - der vorhandenen Menübildschirm einfach, es erkennen kann ist Präsenz und fügen Sie es der Liste für den Benutzer angezeigt.
Zunächst betrachten wir den Fall einer statisch gebundene Menge von Menüfunktionen; Das heißt, werden alle verfügbaren Vorgänge innerhalb der Anwendung kompiliert. Beachten Sie jedoch, dass dies einfach eine Bequemlichkeit; der Menübildschirm selbst hat noch kein explizites Wissen über die verfügbaren Vorgänge oder wie sie in der Anwendung verknüpft sind. Stattdessen jede Menübedienung registriert sich selbst mit dem Werk und die Menü-Form wird die Fabrik für die verfügbaren Einträge zu verhören. Das Menü-Formular ist dann frei, diese Einträge in irgendeiner Weise zu präsentieren, wie es für hält richtig. Wenn der Benutzer einen Eintrag auswählt, die Fabrik wird gebeten, eine konkrete Instanz des speziellen zu konstruieren und dies wird dann angezeigt.
Die Fabrik selbst hat eine sehr einfache Schnittstelle. Es hat eine Methode namens Register, die durch die Menüeinträge selbst verwendet wird, um das Werk ihrer Existenz zu informieren (Ich habe Register verwendet wie es die Nomenklatur verwendet imitiert durch andere Fabriken in Delphi selbst, wie die Registrierung von Komponenten für die Anzeige in der Palette 'Komponente'). Darüber hinaus hat die Fabrik zwei Eigenschaften, die eine andere Klasse, die Anzahl der Mitglieder innerhalb der Fabrik zu beobachten, und ermöglicht den Zugriff auf jedes. Listing 1 zeigt eine vollständige Implementierung für diese Fabrik.
Wir müssen jetzt einige Menüfunktionen die Fabrik hinzu. Dies ist sehr einfach: einige neue Formulare erstellen, die Klausel verwendet im Abschnitt über die Implementierung der MenuActionFactory-Einheit hinzu, und fügen Sie jede Form-Einheit wird im folgenden code an den Fuss:
Initialisierung
MenuActions.Register (TMyNewForm);
Die TMyNewForm-Referenz sollte mit dem Klassennamen der bestimmten Form für das fragliche Gerät ersetzt werden. Nun, da unsere Klassenfactory initialisiert wurde, können wir unseren Geist, wie es angewendet werden kann wenden.
A la Carte Menüs
Als zuvor beobachteten sind viele 'offensichtliche' Möglichkeiten, dass sich der Benutzer um eine Wahl von vielen visuell ansprechend. Eine vertikale Liste der große Tasten (mit langen Beschriftungen) ist eine besonders unattraktiv, aber überraschend gemeinsame Lösung. Betrachten Sie, wie Windows ein ähnliches Benutzer Schnittstelle Problem löst: das Control Panel ist ein gutes Beispiel für eine Liste der unterschiedlichen Vorgänge. Dies ist nichts anderes als eine Listenansicht, aber eine Reihe von gut gestalteten Icons und einheitliches Layout geht einen langen Weg um eine attraktive Schnittstelle. Dazu kommt die eingebaute Fähigkeit einer Listenansicht, die Ikonen neu zu ordnen, es angepasst wird und Symbole der verschiedenen Größen oder einer aussagekräftigeren Berichtsansicht angezeigt, und Sie haben eine fast ideale Auswahl-Werkzeug.
Um einen neuen Menübildschirm erstellen, Löschen einer Listenansicht auf ein leeres Formular, und richten Sie es auf den Clientbereich. Möchte ich lassen eine TCoolBar oben ausgerichtet auf das Formular und fügen ein paar flache Tasten (mit Bildern aus dem Explorer Riss) erlauben den Benutzer, die ViewStyle der Listenansicht ändern. Damit wird die Listenansicht, die Symbole automatisch anordnen, fügen Sie den folgenden Code an das FormResize-Ereignis:
lvwForms.Arrange (ArDefault);
Schließlich müssen wir die Form einer Bildliste hinzu, und verknüpfen Sie es mit der Listenansicht LargeImages-Eigenschaft.
Wir müssen jetzt die Optionen des Menüs innerhalb der Fabrik in der Listenansicht angezeigt. Dazu gehört mit dem Fahrrad durch die registrierte Menüoptionen und erstellen ein neues Listenelement für jeden. Jedes Listenelement einen Bildindex für ihr Symbol und Beschriftung zugewiesen werden müssen - dies direkt aus den gleichen benannten Eigenschaften von registrierten Form getroffen werden. Es ist möglich, weitere Informationen zu den Menüpunkten für die Instanz hinzufügen, wenn die Listenansicht im VsReport Modus befindet; Es kann sein, dass eine gute Idee, eine lange Beschreibung als zweite Spalte angezeigt, sodass unerfahrene Nutzer ein besseres Verständnis erhalten, was bedeutet jede Aktion hinzufügen. Ein gutes Beispiel dafür sehen in der Management-Konsole von Windows 2000.
Der Schlüssel zu diesem Prozess ist, dass die Menü-Präsentationsformat selbst nur dem MenuActionFactory-Gerät selbst und keiner bestimmten Menü Option Formulare verwenden muss. Diese Spezialisierungen sind vollständig in die Fabrik versteckt; wie ihr Name andeutet, erstellt er eine konkrete Klasse den richtigen Typ ohne Client jemals benötigen, um die genauen Details wissen.

Listing 2 zeigt den Code erforderlich, um die Listenansicht zu füllen. Beachten Sie, dass wie es jeder registrierte Menüaktion durchläuft, die Fabrik die erforderliche Klasse erstellt. Das Menü-Formular erstellt dann ein neues Listenelement mit relevanten Informationen vor dem Zerstören des Objekts. Beachten Sie, dass damit dies ordnungsgemäß funktioniert die Konstruktoren auf den eingetragenen Klassen virtuell sein müssen; Dies gilt bereits für visuelle Komponenten wie Formen (weil Delphi eine Fabrik verwendet, um sie zu erstellen, wie sie in aus gestreamt werden. DFM-Dateien und Ressourcen), aber für benutzerdefinierte Klassen gilt es, einen virtuellen Konstruktor in ihrer Klassenhierarchie einzuführen.
Wenn dieses Formular für den Benutzer dargestellt ist und wird durch einen Doppelklick auf ein Element ausgewählt, dann Fragen wir wieder unsere Fabrik erforderliche spezifische Form erstellen können, können die dann angezeigt werden. Es gibt absolut keine Einschränkungen über die Möglichkeiten dieser Formen, aber die Eleganz des Musters Fabrik ist, dass der Client der Fabrik im Detail unwissend bleiben kann. Weitere Menü-Optionen hinzugefügt werden können ein sich entwickelndes System einfach durch ein neues Formular erstellen und registrieren mit der Fabrik - sie werden sofort hinzugefügt werden in das Menüsystem das nächste Mal, wenn, das die Anwendung ausgeführt wird. Diese mangelnde Kopplung zwischen den Elementen des Systems erheblich erleichtert Anwendungswartung für Großprojekte - einfach durch die Registrierung von Klassen mit einer Fabrik der Entwickler weiß, dass jeder Teil der Anwendung, die ein Interesse an solchen Dingen hat aktualisiert wird.
Es ist leicht zu sehen, wie diese Menü-Lösung an sich generisch ist und kann auf eine Reihe von Anwendungen angewendet werden oder sogar der gleichen Anwendung eine Anzahl von Zeiten. Ich habe in vielen meiner Anwendungen ein Hauptmenü, in dem alle wichtigen Module innerhalb der Suite, zwei solche Module, die Berichterstattung wird angezeigt und allgemeine Dienstprogramme. Wenn diese bestimmte Module ausgewählt werden sie wiederum ein weiteres Menü Berichte zeigen und Dienstprogramme zu präsentieren bzw. innerhalb des Systems. Dieser Menü-Formen gemeinsamen durch visuelle Formularvererbung, unterscheiden nur in der Fabrik, die sie verwenden (es gibt verschiedene Fabriken für Module, Berichte und Dienstprogramme). Der Vorgänger des visuellen Form geteilt durch alle drei kann sehr funktionell, die Anwendung für jede Menüoption dynamisch TMenuItem Einträge hinzufügen. Das Schlüsselwort hier ist die Wiederverwendung von Code durch lose Kopplung - ein wesentlicher Vorteil von objektorientierten Prinzipien. Im Vergleich dazu sieht der traditionelle Ansatz eng Kopplung einzigartiges Menü Formulare an ihre spezifischen Menüaktionen unflexibel und unhandlich.
Letzte Artikel-problem
Letzte Artikel wir diskutiert, wie ein Delegatobjekt bereitgestellt werden konnte, Business-Objekt-Informationen beibehalten werden, und wurde die Frage gestellt, wo könnte diese Bestimmung statt? Die offensichtliche Antwort auf die Frage ist das Verwaltungsobjekt Daten im Konstruktor des Business-Objekts zu erstellen:
Konstruktor TMyPDObject.Create;
beginnen
erbte;
Erforderlichen Informationen an den Konstruktor übergeben
DMObject: = TMyDMObject.Create;
Ende;
Das Problem bei diesem Ansatz ist, dass jedes Geschäftsobjekt erstellten wir den Aufwand für den Bau eines Verwaltungsobjekts Daten hat. Abhängig von Ihrer Datenbank, dies möglicherweise eine teure Operation, und somit äußerst unerwünscht, vor allem, wenn es, dass viele Business-Objekte gilt konstruiert und werden zerstört, wenn die Anwendung ausgeführt wird. Durch die Schnittstelle der Klasse untersuchen, können gesehen werden, dass die Load und Save-Methoden statusfrei sind-alle Arbeiten in der einzigen Methodenaufruf erreicht ist. Daher, sofern die Anwendung nicht Multithreaded Datenbankaktivitäten in gesonderten Teilen des des Problembereichs erfordert, kann ein einzelnes Datenobjekt Verwaltung unter anderem viele Instanzen der Business-Objekte freigegeben werden, die damit umgehen kann. Noch besser ist, dieses einem Datenobjekt Verwaltung kann auf Startzeit der Anwendung erstellt werden (oder zum ersten Mal ist es erforderlich). Diese Daten-Management-Objekte können als private globale Objekte innerhalb der Umsetzung des Problembereichs erstellt werden, oder eleganter, kann eine Fabrik verwendet werden, Daten-Management-Klassen mit Geschäftsklassen Objekt verknüpfen und diese entsprechend zu erstellen.
(((Listing 1 - eine Implementierung einer Fabrik für Menüfunktionen)))
Einheit MenuActionFactory;
Schnittstelle
verwendet
Klassen, Formen;
Typ
TMenuAction = TForm;
TMenuActionClass = Klasse von TMenuAction;
TMenuActionFactory = Klasse
Private
MenuActionList: TList;
Funktion GetCount: Integer;
Funktion GetMenuAction (Index: Integer): TMenuAction;
öffentliche
Konstruktor erstellen;
Destruktor Destroy; außer Kraft setzen;
Verfahren Register (MenuActionClass: TMenuActionClass);
Eigenschaft Count: Integer lesen GetCount;
Eigenschaft MenuAction [Index: Integer]: TMenuAction lesen GetMenuAction; in der Standardeinstellung;
Ende;
var
MenuActions: TMenuActionFactory;
Umsetzung
Konstruktor TMenuActionFactory.Create;
beginnen
erbte;
MenuActionList: = TList.Create;
Ende;
Destruktor TMenuActionFactory.Destroy;
beginnen
MenuActionList.Free;
erbte;
Ende;
Funktion TMenuActionFactory.GetCount: Integer;
beginnen
Ergebnis: = MenuActionList.Count;
Ende;
Funktion TMenuActionFactory.GetMenuAction (Index: Integer): TMenuAction;
beginnen
Assert ((Index > = 0) und (Index < Count), 'Index außerhalb des gültigen Bereichs.');
Konstruieren und den ausgewählten Eintrag zurück
Ergebnis: = TMenuActionClass (MenuActionList[Index]). Erstellen Sie (nil);
Ende;
Prozedur TMenuActionFactory.Register (MenuActionClass: TMenuActionClass);
beginnen
MenuActionList.Add (MenuActionClass);
Ende;
Initialisierung
MenuActions: = TMenuActionFactory.Create;
Finalisierung
MenuActions.Free;
Ende.
(((Ende Codebeispiel 1)))
(((Listing 2 - Verwenden einer Fabrik zum Auffüllen von einer Listenansicht)))
Prozedur PopulateListView (LvwMenu: TlistView; Fabrik: TMenuActionFactory);
var
Index: Integer;
MenuAction: TForm;
beginnen
für Index: = 0, Factory.Count - 1 fangen
MenuAction: = Factory.MenuAction[Index];
mit lvwMenu.Items.Add fangen
Bildunterschrift: = MenuAction.Caption;
ImageIndex: = lvwMenu.LargeImages.AddIcon (MenuAction.Icon);
SubItems.Add (MenuAction.Hint);
Ende;
Ende;
Ende;
(((Ende Codebeispiel 2)))
Weiter in Serie


Fabrik-Muster für Menüfunktionen

Fabrik-Muster für Menüfunktionen : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Fabrik-Muster für Menüfunktionen
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung