Factory Pattern: Mit Generics umgehen

Kababär

Top Contributor
Hi,

ich habe ein Interface Converter<I, S>, von dem es mehrere Implementierungen verschiedener Kategorien gibt.
Zur Laufzeit sollen die Converter austauschbar sein, weshalb ich mich für das Factory-Pattern entschieden habe. Problem hierbei sind die Generics.. Jede Implementierung hat für I und S komplett verschiedene Objekttypen. Kann ich nun trotzdem eine Factory erstellen, die mir ein Converter-Objekt zurück gibt, das nicht mehr gecastet werden muss?

Mein Interface sieht so aus

Code:
public interface Converter<I, S> {

    S convert(I i) throws Exception;
    boolean wasSuccessful();
   
}

Eine mögliche Implementierung sieht so aus

Code:
public class IntConverter implements Converter<String, List<Integer>>{

    @Override
    public List<Integer> convert(String s) {
        /**
         * do some conversions
         */
    }
}

oder

Code:
public class GradeConverter implements Convert<List<URL>, List<Grade>>{

    @Override
    public List<Grade> convert(List<URL> urls){
        /**
         * do some work
         */
    }
}

Wie baue ich dann mein Factory so, dass es nach außen hin typsicher bleibt?

Meine Factory sieht so aus
Code:
public static Converter<?, ?> createConverter(Type t) throws NoSuchDetectorException {

        switch (t) {
        case CASE1:
            return new IntConverter();
        case CASE2:
            return new GradeConverter();
        default:
            throw new NoSuchDetectorException("No converter installed for framework: " + t.getVal());

        }
    }

Wirklich dynamisch bin ich damit ja nicht unbedingt unterwegs. Hat jemand eventuell einen Tipp für mich?
 

mrBrown

Super-Moderator
Mitarbeiter
Was ist denn Type für ein Typ?


Eine (mMn unschöne) Lösung wäre, createConverter generisch zu machen, dann brauchst du zumindest außerhalb keine Casts:

Code:
public static <T,I> Converter<T, I> createConverter(Type t) {

        switch (t) {
            case CASE1:
                return (Converter<T, I>) new IntConverter();
            case CASE2:
                return (Converter<T, I>) new GradeConverter();
            default:
                return null;
        }
    }


Wirklich dynamisch bin ich damit ja nicht unbedingt unterwegs
Was meinst du in dem Fall mit dynamisch?
 

Kababär

Top Contributor
Type ist ein Enum.

Deine Lösung gefällt mir schon besser. Dann habe ich nur einen zentralen Ort zur Pflege und Wartung des Codes. Wenn du die Lösung als unschön empfindest, hat jemand noch eine schöne Lösung parat?

Was meinst du in dem Fall mit dynamisch?
Damit meine ich einfach das benötigte Casting außerhalb der Factory.
 

mrBrown

Super-Moderator
Mitarbeiter
Type ist ein Enum.

Deine Lösung gefällt mir schon besser. Dann habe ich nur einen zentralen Ort zur Pflege und Wartung des Codes. Wenn du die Lösung als unschön empfindest, hat jemand noch eine schöne Lösung parat?
Ich persönlich würde auf die Factory verzichten und den Enum als Factory nutzen.
Enum und switch in Kombination ist eigentlich immer Unsinn ;)

Ansonsten ginge noch generische AbstractFactory, und pro Typ dann eine eigene - das Mapping Typ<->Factory zB über eine Map (wobei man da vermutlich wieder casten müsste, je nach Umsetzung)
 

CSHW89

Bekanntes Mitglied
Ich würde es vermutlich wie folgt machen:
Java:
public class Type<T,I> {
   
    public static final Type<String, List<Integer>> INT_CONVERTER = new Type<>(IntConverter::new);
    public static final Type<List<URL>, List<Grade>> GRADE_CONVERTER = new Type<>(GradeConverter::new);
   
    private Supplier<Converter<T, I>> factory;
   
    private Type(Supplier<Converter<T, I>> factory) {
        this.factory = factory;
    }
   
    public Converter<T, I> getInstance() {
        return factory.get();
    }
}
Ist quasi die Lösung von mrBrown, also ohne Factory-Klasse. Allerdings habe ich aus dem Enum eine normale Klasse gemacht, die ein Enum nachahmt. Leider gibt es in Java keine generischen Enums.

Grüße
Kevin
 

Kababär

Top Contributor
Ok, die Idee dahinter verstehe ich. So muss ich bei Änderungen bzw. Erweiterungen lediglich ein neues Attribut anlegen, statt einen neuen Enum Case. Wie verhält es sich, wenn die Objekterstellung von mehreren Enums bzw. jetzt Klassen abhängt? Eine Map von Maps anlegen oder lieber eine eigene "Kriterienklasse" schreiben, die beinhaltet, welche Voraussetzungen zum Erstellen einer Klasse gelten?
 

mrBrown

Super-Moderator
Mitarbeiter
Letzteres (selbst wenn es intern dann nur mit einer Map umgesetzt ist) - gewinnt deutlich an Les- und Wartbarkeit ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Meeresgott Best Practice "Spezifisches" Factory Pattern ? Allgemeine Java-Themen 1
Meeresgott OOP Factory Muster ausbauen Allgemeine Java-Themen 34
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Factory Allgemeine Java-Themen 14
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
Luk10 Factory auf meine Situaion anwendbar? Allgemeine Java-Themen 14
M Eigene Factory Klasse Allgemeine Java-Themen 21
T So eine Art Singleton-Factory? Allgemeine Java-Themen 3
S Designproblem: Factory organisieren Allgemeine Java-Themen 4
EagleEye erstellen ein factory Allgemeine Java-Themen 13
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 7
L Pattern Eventhandler Allgemeine Java-Themen 5
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Z MVC Pattern - sinnvolle Integration Allgemeine Java-Themen 6
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
M Vaadin MVP Pattern Allgemeine Java-Themen 1
N Java MVC Pattern richtig anwenden Allgemeine Java-Themen 24
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
B MVC-Pattern größeres Beispiel Allgemeine Java-Themen 16
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
L Erste Schritte Java Date Format Pattern bestimmten Allgemeine Java-Themen 2
D Pattern mit Pattern vergleichen Allgemeine Java-Themen 3
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Hilfe bei geeignetem Pattern (Decorierer) Allgemeine Java-Themen 2
F Welches Design Pattern? Allgemeine Java-Themen 3
J Pattern aus String entfernen Allgemeine Java-Themen 2
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
Rudolf State Pattern als Enum? Allgemeine Java-Themen 10
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
Guybrush Threepwood Pattern gesucht: Punkt ohne Leerzeichen dahinter Allgemeine Java-Themen 3
turmaline OOP Decorater Pattern für Varifikationsverhalten Allgemeine Java-Themen 13
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
H Pattern.compile Syntax Allgemeine Java-Themen 15
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
T Pattern für Benutzer-Gruppen, RMI Allgemeine Java-Themen 5
E Super erzwingen, konzept/pattern gesucht. Allgemeine Java-Themen 8
H Problem mit der Klasse Pattern - Regulärer Ausdruck Allgemeine Java-Themen 2
Eldorado Meinung zu einem abgewandelten MVC-Pattern Allgemeine Java-Themen 2
R Matcher - Pattern mit belibigem Anfang Allgemeine Java-Themen 2
H Bestimmten String mit Pattern und Matcher herauslesen => kein erfolg Allgemeine Java-Themen 9
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
I Template Method pattern mit "geschützten Methoden" Allgemeine Java-Themen 5
T Pattern: Passive View Allgemeine Java-Themen 2
K Verständnisprobleme bei Observer-Pattern mit größerem Datenmodell Allgemeine Java-Themen 32
T Pattern: Greedy, Reluctant, Possessive Allgemeine Java-Themen 4
S Hilfe bei Pattern Allgemeine Java-Themen 5
N Registry Pattern Allgemeine Java-Themen 7
Tandibur Denkfehler bei Pattern.matches? Allgemeine Java-Themen 3
Tandibur pattern dynamisch vorkompilieren Allgemeine Java-Themen 9
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
N Pattern Allgemeine Java-Themen 11
Iron Monkey Pattern - Matcher - Problem Allgemeine Java-Themen 3
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
U Verständnisschwierigkeiten Observer Pattern Allgemeine Java-Themen 18
H2SO3- String(pattern) von SimpleDateFormat auslesen Allgemeine Java-Themen 7
M Problem mit Pattern Allgemeine Java-Themen 3
N Welches design pattern? Allgemeine Java-Themen 8
B Pattern gesucht, Programm Optionen, Casten vermeiden Allgemeine Java-Themen 3
D Welches Pattern kann ich nutzen? Allgemeine Java-Themen 9
J Suche regex-Pattern fuer Liste von Zahlen zwischen 0-100 Allgemeine Java-Themen 6
G Sequenzdiagramm Dao Pattern Allgemeine Java-Themen 3
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
S regex-Pattern Ausdruck negieren Allgemeine Java-Themen 2
J Pattern eines Textes Allgemeine Java-Themen 4
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
Y Pattern Problem Allgemeine Java-Themen 2
G UML-Diagramme mit DAO Pattern Allgemeine Java-Themen 7
S Pattern regex Allgemeine Java-Themen 2
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
J Regex Pattern Problem Allgemeine Java-Themen 12
P MVC Pattern Allgemeine Java-Themen 31
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
G Frage zu MVC Pattern Allgemeine Java-Themen 6
J Pattern und Regex Allgemeine Java-Themen 2
L Wie Pattern anwenden um Cipher zu nutzen Allgemeine Java-Themen 2
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
F Typüberprüfung in Superklasse - geeignetes Pattern? Allgemeine Java-Themen 11
M Java Pattern hilfe Allgemeine Java-Themen 6
N Observer Pattern Allgemeine Java-Themen 2
G Problem mit MVC-Pattern (Controller als anonyme Unterklasse) Allgemeine Java-Themen 2
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
M Pattern aus Properties Allgemeine Java-Themen 3
I Composite Pattern für Ausgabe von Ausdruck Allgemeine Java-Themen 3
G mit Pattern strings filtern ein kleines problemchen ;) Allgemeine Java-Themen 2
M nach einem Pattern splitten Allgemeine Java-Themen 2
F Composite Pattern in Java? Allgemeine Java-Themen 1
G problem mit dem observer pattern Allgemeine Java-Themen 3
C Matcher/Pattern ersetzten für JDK 1.3 Allgemeine Java-Themen 2
M Pattern: Summary of regex constructs: Backslash Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben