14 Stimmen

Implementiere ich eine auf Generika basierende Java-Fabrik richtig?

Ich glaube nicht, dass ich das Fabrikmuster richtig implementiere, weil die Application Klasse' createDocument Methode akzeptiert jeden Klassentyp, nicht nur Unterklassen von Document .

Mit anderen Worten, gibt es eine Möglichkeit, die createDocument Methode, um nur Unterklassen von Document ?

  • Dokument.java

    package com.example.factory;
    
    public abstract class Document {
        public Document() {
            System.out.println("New Document instance created: " + this.toString());
        }
    }
  • DrawingDocument.java

    package com.example.factory
    
    public class DrawingDocument extends Document {
        public DrawingDocument() {
            System.out.println("New DrawingDocument instance created: " this.toString());
        }
    }
  • Anwendung.java

    package com.example.factory;
    
    public class Application {
        public <T> T createDocument(Class<T> documentClass) {
            try {
                return documentClass.newInstance();
            } catch (InstantiationException e) {
                throw new IllegalArgumentException(e);
            } catch (IllegalAccessException e) {
                throw new IllegalArgumentException(e);
            }
        };
    }
  • Main.java

    package com.example.factory;
    
    public static void main(String[] args) {
        Application application = new Application();
        application.createDocument(DrawingDocument.class);
    }

18voto

Yet Another Geek Punkte 4141

Sie sollten gebunden Ihre Generika so, dass sie nur T's verwenden, die Document erben. Beispiel:

public class Application {
    //Add extends Document after T
    public static <T extends Document> T createDocument(Class<T> documentClass) throws InstantiationException, IllegalAccessException {
        return documentClass.newInstance();
    };
}

6voto

Roland Illig Punkte 38839

Der Code sieht gut aus. In einer echten Implementierung sollte die Factory-Methode nicht so deklariert werden, dass sie eine der Reflection-bezogenen Ausnahmen auslöst. Und Sie werden wahrscheinlich sowieso einen anderen Code haben, um das Dokument zu erstellen.

Die Methode faxtory sollte eine Class<? extends Document> als Parameter, so dass man ihn nicht auffordern kann, eine String zum Beispiel.

[update:] Codebeispiel:

public Document createDocument(Class<? extends Document> clazz) {
  try {
    return clazz.newInstance();
  } catch (InstantiationException e) {
    throw new IllegalArgumentException(e);
  }
}

3voto

Grooveek Punkte 9951

Wo liegt die Beschränkung auf den Dokumententyp in der Fabrik? Versuchen Sie

public <T extends Document> T createDocument(Class<T> documentClass) throws InstantiationException, IllegalAccessException {
    return documentClass.newInstance();
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X