2017-09-09 4 views
0

Das ist mein Problem: Ich schreibe eine Java-Bibliothek, die eine bestimmte Art von Nachricht auf eine von zwei möglichen Arten verarbeiten kann (aber möglicherweise kann der Client andere Verarbeitungsmodalitäten hinzufügen). Ich habe die folgenden Klassen erstellt, nach der Strategie-Muster:Wie kann ich ein Factory-Muster verwenden, um Objekte zu initialisieren, die aus einer Konfiguration gelesen werden?

interface Processor { 
     Message processMessage(); 
    } 

    class ProcessorOne<M extends Message> implements Processor{ 
     M processMessage(){ //do stuff } 
    } 

    class ProcessorTwo<M extends Message> implements Processor{ 
     M processMessage(){ //do other stuff } 
    } 

    abstract class Message{ 
    } 

    //example 
    class MessageTypeOne extends Message{ 
    } 
    //example 
    class MessageTypeTwo extends Message{ 
    } 

Jetzt verwendet der Client eine Konfiguration in einer Weise, so dass für jede konkrete Art von Nachricht, die er sagt: „MessageTypeOne: ProcessorOne, MessageTypeTwo: ProcessorTwo , MessageTypeThree: ProcessorOne ", wodurch festgestellt wird, dass Nachrichten des Typs MessageTypeOne von der Klasse ProcessorOne usw. verarbeitet werden müssen. Die Konfiguration kann eine XML-Datei oder eine andere Art von Konfiguration sein, dies liegt beim Client.

Meine Frage ist: Wie kann ich eine "Verbindung" zwischen dem, was Client von der Konfiguration liest (mit seiner eigenen Art der Analyse, je nach Konfigurationstyp) und der Instanziierung der konkreten Prozessoren mit einer Factory erstellen Muster?

Vielen Dank im Voraus

Antwort

0

Ich denke, es ist schwierig, das zu archivieren. Sie können die Prozessorinstanz basierend auf ihrem Namen über das Factory-Muster erstellen, können diese beiden Klassen jedoch nicht der Konfigurationsdatei zuordnen. Ich denke, der einfachste Weg ist die Verwendung unterschiedlicher Factory für Ihre Geschäftslogik. Zum Beispiel:

Map<String, String> conf = null; // What parsed from config 
    String messageType = // What you have 
    Processor processor = ProcessorFactory.createProcessor(conf.get(messageType)); 
    Message message = MessageFactory.createMessage(messageType); 
    // processing 
+0

Auf diese Weise verantwortlich gemacht Client ist nur die Karte zu füllen, und dann eine Bibliothek Methode aufrufen, dass die Karte Inhalt Schleifen über konkrete Prozessoren zu schaffen (durch Reflexion ich denke), habe ich recht? – sibly22

+0

@ sibly22 Ja. Die Prozessorinstanz kann auch in einer Karte zwischengespeichert werden. –

+0

Vielen Dank – sibly22

Verwandte Themen