Scegli dinamicamente la classe di fabbrica corretta con Inversion of Control

2

Ho un TreeView e voglio abilitare il menu contestuale quando clicchi con il tasto destro del mouse. È composto da elementi di diverse classi , ma condividono tutti la stessa classe base .

Quindi, stavo considerando di creare un FactoryClass per ogni classe di oggetto differente che restituisce semplicemente un'interfaccia IContextMenu personalizzata (che in seguito verrà utilizzata da qualche altra parte del programma per rendere effettivamente il menu).

Questo è il flusso di lavoro corrente che ho in mente

  1. Il TreeView intercetta il clic con il tasto destro e richiede un'altra classe (chiamiamolo ContextMenuFactory ) per creare un menu contestuale per quel tipo di oggetto
  2. ContextMenuFactory reindirizza a uno specifico classe di produzione associata al tipo di elemento di input (come IFooItemContextMenuFactory )
  3. IFooItemContextMenuFactory class effettivamente crea l'istanza IContextMenu

Ciò che rende difficile questa attività è il secondo passo.

Non so come posso organizzare il mio codice per renderlo dinamico perché l'unica soluzione che ho in mente è solo implementare un interruttore e creare la classe factory dopo che ho riconosciuto il tipo.

Il modo ideale sarebbe utilizzare il contenitore per trovare l'implementazione configurata, in questo modo non devo modificare ogni volta che creo un nuovo oggetto digita lo switch precedentemente suggerito.

    
posta simoneL 07.04.2015 - 11:49
fonte

1 risposta

3

Lo farei:

  • Per ogni classe che implementa IContextMenu crea una Fabbrica / Creatore. Ad esempio per una classe chiamata TypeAContextMenu crea un TypeAContextMenuCreator , per TypeBContextMenu crea un TypeBContextMenuCreator , ecc. Ogni creatore implementa la stessa interfaccia, come ad esempio IContextMenuCreator , ha solo un metodo create() che restituisce un oggetto di tipo IContextMenu ;
  • Crea un HashMap , crea un'istanza di tutti i creator e inseriscili in HashMap con un tag:

    Map<String,IContextMenuCreator> c = new HashMap<String,IContextMenuCreator>();
    creator.put("TYPEA", new TypeAContextMenuCreator());
    creator.put("TYPEB", new TypeBContextMenuCreator());
    creator.put("TYPEC", new TypeCContextMenuCreator());
    
  • Quindi l'oggetto su cui fai clic con il pulsante destro del mouse nella vista ad albero dovrebbe includere il tag corrispondente IContextMenuCreator come membro.

  • Quando fai clic con il pulsante destro del mouse, ottieni il creatore appropriato da HashMap . Non c'è bisogno di interruttori. Quando vengono creati nuovi tipi di menu contestuali, devi solo aggiungerli in un unico posto.

    IContextMenu cm = creators.get(tag).create();

risposta data 07.04.2015 - 15:13
fonte