Qual è l'approccio migliore per risolvere un problema del metodo factory che deve essere un'istanza?

2

Devo aggiungere una nuova funzionalità in un progetto legacy del servizio web e sto pensando quale sia l'approccio migliore per una situazione concreta.

Il servizio web è semplice: riceve un file XML, elimina il tutto, genera oggetti di risposta, marshalling e infine invia la risposta come file XML. Per ogni file XML ricevuto, il servizio Web risponde sempre con la stessa struttura XML.

Quello che devo fare è generare un file XML diverso in base all'XML ricevuto. Quindi ho una classe controller che ha tutte le operazioni di marshalling / unmarshalling, ma questa classe controller deve essere un'istanza. A seconda dell'XML ricevuto, ho bisogno di alcuni metodi di marshalling o di altri.

Cercando di apportare poche modifiche alla fonte legacy, qual è l'approccio migliore? Il mio primo approccio è stato quello di fare un modello di metodo factory con la classe controller, ma questa classe deve essere un'istanza.

Voglio mantenere, per quanto possibile, questa struttura:

classController.doMarshalling();

Penso che questo sia un po 'puzzolente:

if(XMLReceived.isTypeOne())
    classController.doMarshallingOne();
else if(XMLReceived.isTypeTwo())
    classController.doMarshallingTwo();
else if(XMLReceived.isTypeThree())
    classController.doMarshallingThree();
else if ...

Spero che la mia domanda sia ben compresa

    
posta ilazgo 08.11.2012 - 20:38
fonte

3 risposte

4

Questo è un problema comune, mappando l'input a una classe che può elaborarlo. Una soluzione comune è creare una mappa dal tipo di input alla classe di elaborazione. Per gestire l'input, è necessario determinare il tipo di input, utilizzare la mappa per cercare la classe di elaborazione, quindi creare un'istanza della classe e chiamare i metodi desiderati.

In Ruby:

processorByType = { 'type1' => Type1Processor, 
                    'type2' => Type2Processor, 
                    ... 
}

def handle(input)
    processorByType[input.type].new().process(input, context);
end
    
risposta data 08.11.2012 - 21:39
fonte
0

Questo non è un caso classico per generici ?

try
{
    ClassController<typeof(XmlReceived)>.DoMarshalling();
    // OR...
    ClassController.DoMarshalling<typeof(XmlReceived)>();

}
catch (...)
{
    ... handle if XmlReceived is not a supported type
}
    
risposta data 08.11.2012 - 21:24
fonte
0

Potresti usare il modello di strategia. Fa esattamente quello che vuoi, esegue diversi algoritmi per diversi scenari che sono spesso correlati. L' articolo di Wikipedia fornisce un'implementazione di esempio per java.

    
risposta data 10.11.2012 - 16:27
fonte

Leggi altre domande sui tag