Fabrikmuster ohne Schalter oder Wenn / Dann

8

Ich suche nach einem einfachen Beispiel, wie man eine Factory-Klasse implementiert, aber ohne die Verwendung eines Schalters oder einer Wenn-Dann-Anweisung. Alle Beispiele, die ich finden kann, benutzen eins. Zum Beispiel, wie könnte man dieses einfache Beispiel ändern (unten), so dass die tatsächliche Fabrik nicht vom Switch abhängig ist? Es scheint mir, dass dieses Beispiel das Open / Close-Prinzip verletzt. Ich möchte in der Lage sein, konkrete Klassen ('Manager', 'Clerk', 'Programmer' usw.) hinzuzufügen, ohne die Fabrikklasse ändern zu müssen.

Danke!

%Vor%

UPDATE:

Wow! Danke allen! Ich habe eine Tonne gelernt. Nachdem ich alle Rückmeldungen erhalten hatte, mischte ich einige der Antworten ein und kam auf diese Idee. Ich wäre offen für einen weiteren Dialog über einen besseren Weg, dies zu tun.

%Vor%

Eine andere Bearbeitung:

Es ist auch möglich, eine Instanz der Schnittstelle mit einem unbekannten Typ zu erstellen:

%Vor%

Was könnte dann wie folgt aufgerufen werden:

%Vor%     
Casey Crookston 23.11.2015, 18:40
quelle

4 Antworten

4

Wie wäre es damit (kein Wörterbuch erforderlich und beachten Sie, dass Sie einen Syntaxfehler erhalten, wenn Sie Create<Position>() versuchen):

EDIT - Aktualisiert, um eine explizit implementierte IPosition-Schnittstelle zu verwenden. Nur Instanzen von IPosition können auf die Elementfunktionen zugreifen (z. B. <implementation of Manager>.Title wird nicht kompiliert).

EDIT # 2 Factory.Create sollte bei richtiger Verwendung der Schnittstelle eine IPosition nicht T zurückgeben.

%Vor%     
Clay Ver Valen 23.11.2015, 19:07
quelle
5

Sie können benutzerdefinierte Attribute und Reflektionen verwenden.

%Vor%

In Ihrer Factory könnten Sie dann alle Klassen erhalten, die von Position erben, und die mit dem PositionType -Attribut mit dem richtigen Wert finden.

%Vor%     
Craig W. 23.11.2015 18:44
quelle
2
%Vor%

Verwendet wie folgt:

%Vor%     
Bradley Uffner 23.11.2015 18:50
quelle
1

Warum Dinge zu kompliziert machen? Hier ist eine einfache Lösung:

%Vor%

So können Sie dies tun, ohne überhaupt eine Factory-Klasse zu verwenden:

%Vor%     
Tanuki 23.11.2015 19:23
quelle

Tags und Links