Questo è simile a una delle mie altre domande, ma abbastanza diverso penso di giustificare una nuova domanda.Domanda su fabbriche astratte e iniezione
Fondamentalmente sto scrivendo un'interfaccia utente e la mia interfaccia utente ha nodi che possono essere selezionati. Quando viene selezionato un nodo, l'interfaccia utente termina con una classe base di nodo astratta "INode". Da questo ottengo una factory facendo node-> getFactory(), e da questo posso creare le finestre di dialogo o le viste appropriate per quel nodo perché il factory corretto viene restituito dal nodo concreto (ad esempio factory-> createAddDialog(), factory- > createView (nodo), ecc.).
La mia domanda è di provare a trovare il modo migliore per quella fabbrica di entrare nel nodo in primo luogo.
Finora ho pensato di 3 modi:
1) Iniettare la corretta fabbrica quando creo il nodo:
AreaNode *node = new AreaNode(new AreaNodeFactory());
Così la definizione di AreaNode è:
AreaNode : public INode
{
AreaNode(INodeAbstractFactory *injectedFactory)
{
m_injectedFactory = injectedFactory;
}
INodeAbstractFactory* getFactory()
{
return m_injectedFactory;
}
INodeAbstractFactory* m_injectedFactory;
};
2) Iniettare uno stabilimento più generale e consentire al nodo di ottenere la fabbrica da quella fabbrica:
AreaNode : public INode
{
AreaNode(IFactory *injectedFactory)
{
m_injectedFactory = injectedFactory;
}
INodeAbstractFactory* getFactory()
{
return m_injectedFactory->getAreaNodeFactory();
}
IFactory* m_injectedFactory;
}
3) Basta creare la fabbrica di cemento (anche se questo elimina la possibilità di utilizzare diverse fabbriche per lo stesso nodo, forse per il test o per le modifiche successive):
AreaNode : public INode
{
INodeAbstractFactory* getFactory()
{
return new AreaNodeFactory();
}
}
pensieri attuali su queste opzioni:
Opzione 1: Potrebbe essere un po 'casuale: dovrei assicurarmi di dargli sempre la fabbrica corretta per quel tipo, o forse potrei semplicemente usare un'altra fabbrica per iniettare la fabbrica corretta per me.
Opzione 2: costringe il nodo a conoscere l'implementazione della fabbrica astratta abbastanza da essere in grado di chiamare getAreaNodeFactory, che potrebbe non essere una cosa così brutta. Almeno aiuta a garantire che lo stesso factory sia sempre corretto (presupponendo che lo stabilimento più generale sia implementato correttamente).
Opzione 3: Questo si sente un po 'restrittivo in quanto non sarò in grado di scambiare la lezione, e non sono entusiasta del nodo che deve conoscere l'implementazione concreta della fabbrica - anche se in questo caso potrebbe non essere troppo di un problema (ultime parole famose!).
Qualche idea su questo?
Grazie.
MODIFICA: Scusate le dichiarazioni delle variabili nel post di origine, corrette.
EDIT: Un altro problema con l'opzione 2 è che devo attuare "getFactory" in ogni tipo di nodo. Almeno con l'opzione 1, la classe base può solo restituire ogni volta l'inject abstract factory.
io non sono nemmeno sicuro i nodi devono fare riferimento le fabbriche. L'interfaccia utente dovrebbe fare riferimento a una fabbrica astratta e utilizzare il polimorfismo per assicurarsi che venga utilizzata la fabbrica di calcestruzzo corretta, in base al tipo di nodo passato nei metodi di creazione. A parte questo, suppongo che l'opzione 1 sia ok. Ma rimango convinto che i nodi non dovrebbero sapere o tenere un riferimento a nessuna fabbrica. – Kurt
@Kurt: nell'assenza di doppia spedizione, ed evitando l'uso di una classe di visitatori per ogni "interfaccia" di interfaccia utente mi piacerebbe l'esecuzione sul nodo in base al tipo di nodo, quale potrebbe essere una soluzione migliore? Il tipo di azione che vorrei eseguire su un nodo è sulla falsariga di: createAddDialog (parentWidget), createView (parentWidget), createMiniView (parentWidget), ecc. Potrei semplicemente inserire i metodi nelle classi di nodi concreti, ovvero areaNode -> createView (parent) - ma questo non fa molto per la separazione. – Mark
Anche se sto cercando di evitare l'uso massiccio del pattern visitor, l'unico modo che posso vedere per mantenere completamente il nodo fuori dal lato dell'interfaccia utente è quello di utilizzare un singolo visitatore per risolvere la classe factory appropriata e da quindi posso creare i miei componenti dell'interfaccia utente .. – Mark