Auf www.dofactory.com fand ich ein echtes Beispiel für das Factory Pattern. Aber der Code generiert eine Warnung in ReSharper über einen virtuellen Memberaufruf in dem Konstruktor.
Der Code, der die Warnung verursacht, ist folgender:
%Vor%Im verbrauchenden Code können Sie dann einfach Folgendes verwenden:
%Vor%Ich verstehe, warum es eine schlechte Idee ist, ein virtuelles Mitglied im Konstruktor aufzurufen (wie erklärt hier ).
Meine Frage ist, wie Sie dies umgestalten können, um immer noch das Factory-Muster zu verwenden, aber ohne den virtuellen Member-Aufruf im Konstruktor.
Wenn ich den Aufruf von CreatePages
aus dem Konstruktor entfernen würde, müsste der Konsument explizit die Methode CreatePages
aufrufen:
Ich bevorzuge eher die Situation, in der das Erstellen eines neuen Resume
alles ist, was benötigt wird, um einen Lebenslauf zu erstellen, der Seiten enthält.
Eine Möglichkeit, dies zu überarbeiten, besteht darin, die Seiten im Voraus zu übergeben und sie an einen geschützten Konstruktor zu übergeben:
%Vor%P.S. Ich bin mir nicht sicher, was das mit der Fabrikmethode zu tun hat. Ihr Beitrag zeigt das Vorlagenmethodenmuster .
Was ist damit? Es verwendet eine verzögerte Initialisierung, bei der die Seiten nur bei Bedarf erstellt werden (anstatt sie im Konstruktor zu erstellen)
Beachten Sie außerdem, dass die Sichtbarkeit der Factory-Methode in protected
geändert wird, um sie vor der öffentlichen Verwendung zu verbergen.
BEARBEITEN Vorschlag:
Ich persönlich mag es nicht, diese globale Variable _pages
zu haben, da es Sie in Schwierigkeiten bringen könnte, wenn sie unter vielen Methoden und Threads geteilt wird. Ich würde lieber das Muster der Fabrikmethode wählen, wie es im GoF-Buch beschrieben ist. Hier ist mein Vorschlag:
Meine Frage ist, wie Sie dies umgestalten können, um immer noch das Factory-Muster zu verwenden, aber ohne den virtuellen Member-Aufruf im Konstruktor.
Gemäß der Definition
DieBei der klassenbasierten Programmierung ist das Factory-Methodenmuster ein schöpferisches Muster, das Factory-Methoden verwendet, um das Problem zu lösen, Objekte zu erstellen, ohne die genaue Klasse des Objekts anzugeben, die erstellt wird.
factory-Methode soll nicht vom Konstruktor verwendet werden, da die genaue Klasse des Objekts, die erstellt wird, zur Konstruktionszeit bekannt ist. Zum Beispiel
Wenn Document
zur Konstruktionszeit alle Pages
erstellen muss, kann dies ohne Factory-Methode erfolgen, da genau alle zu erstellenden Seiten bekannt sind
aber wenn Document
später nach der Konstruktion Pages
erstellen muss und vielleicht mehrere Male, dann ist die Fabrikmethode nützlich
Ich bevorzuge vielmehr die Situation, in der das Erstellen eines neuen Lebenslaufs alles ist, was nötig ist, um einen Lebenslauf zu erstellen, der Seiten enthält.
Wenn also alle Pages
zur Konstruktionszeit erstellt werden sollen, kann dieses konkrete Beispiel ohne Verwendung des Fabrikmethodenmusters umgeschrieben werden:
Die Methode Add
darf von Resume
-Konstruktor verwendet werden, da Document
object vollständig aufgebaut und einsatzbereit ist.
Die Methode Add
ist geschützt, sodass Seiten nur aus Document
oder abgeleiteten Klassen hinzugefügt werden können.
Sie können dies in der Eigenschaft selbst tun.
In diesem Fall kann die Eigenschaft Pages
in der Basisklasse als virtual
markiert werden.
Der hypothetische Code für Resume
könnte folgendermaßen aussehen:
In diesem Fall werden die Seiten beim ersten Zugriff auf Pages
-Eigenschaft und nicht bei ctor
-Ausführung erstellt.
Tags und Links c# design-patterns factory-method