Istanziazione di una classe che implementa un'interfaccia

3

Ho un'interfaccia chiamata Cell . All'inizio del codice, leggo i dati di input da cui posso venire a conoscenza della classe di implementazione (non come un oggetto di classe ma posso sapere ad esempio la stringa). E dopo devo chiamare il costruttore per la classe di implementazione per inizializzare un oggetto.

Quale sarebbe il modo migliore per implementarlo. La prima cosa che ho in mente è di fare qualcosa del genere ( Cell è un'interfaccia, Sphere e Rectangle implementa Cell . Posso impostare un flag booleano chiamato sphere dopo aver letto i dati di input):

Cell startcell;
if (sphere)
    startcell = new Sphere(0);
else
    startcell = new Rectangle(0);

Ma questo è un buon design?

    
posta Captain Jack sparrow 01.12.2011 - 21:32
fonte

2 risposte

4

Sembra un pattern Fabbrica , che è abbastanza "approvato" dai guru del design, per così dire. Vedi in fondo a quelle pagine di Wikipedia per i modelli di creazione esistenti per i linguaggi OOP, come Java.

    
risposta data 01.12.2011 - 21:36
fonte
0

L'implementazione if / else non è molto scalabile: non appena aggiungi un cubo, devi aggiungere un altro se la condizione. Non è davvero un modello di progettazione, ma Java può gestirlo con la riflessione. Puoi leggere il nome della classe da alcune configurazioni e istanziarlo e verificare che implementa l'interfaccia appropriata. Solo una nota a margine, il framework Spring può farlo anche per te.

 // className is read from config, etc
 Class instantation = Class.forName(className);

 if (!Cell.class.isAssignableFrom(instantation))
     throw new Exception("Not a Cell!");

 Cell cell = (Cell) instantion.newInstance();
    
risposta data 01.12.2011 - 21:49
fonte

Leggi altre domande sui tag