Se una fabbrica crea sempre un nuovo oggetto

1

abbiamo una struttura gerarchica in cui ogni nodo è derivato da una classe di base del nodo public Node(INodeFactory nodeFactory) . Il factory viene iniettato in modo che il nodo possa creare i suoi nodi figli utilizzando Get(int id)

In un secondo momento alcuni nodi necessitano di un riferimento a un altro nodo nella struttura. Le informazioni necessarie per ottenere il riferimento potrebbero cambiare in fase di esecuzione e non sono necessariamente disponibili Quando l'oggetto nodo è stato creato. Fondamentalmente questa firma del metodo ha lo stesso aspetto ed è Get(int id) . Questa volta non dovrebbe essere creato alcun nuovo oggetto ma dovrebbe essere restituito uno esistente.

Il nostro primo tentativo è stato passare un INodeLocator che avrebbe cercato il nodo. Prima di tutto non siamo sicuri che "locator" sia un buon nome e se qui mancano alcuni pattern, forse il pattern del repository (ma solo per cercare?). In secondo luogo abbiamo notato che la firma del metodo è la stessa.

Stavamo considerando di passare dalla modalità di "produzione" a quella di "ricerca" dopo che la struttura iniziale è stata creata, ma non funzionerà poiché in seguito sarà necessario creare anche i nodi.

Per la logica del 'localizzatore' stavamo pensando di cercare (iterando) attraverso i nodi, ma forse è meglio tenerne traccia in un dizionario piatto. Ma poi sorge il problema che la fabbrica può aggiungere al dizionario ma non gestisce la vita. Cosa dovrebbe accadere quando un nodo viene rimosso.

Modifica dopo la risposta di Vladimir Stokic: Al momento stiamo pensando a due soluzioni per mantenere pulito il dizionario. Uno è quello di avere un dizionario di riferimenti deboli ma poi spostiamo semplicemente il problema, ci saranno riferimenti deboli che devono essere rimossi (usando un segno di spunta timer di volta in volta?) La seconda idea è di fare in modo che il nodo notifichi la cancellazione della fabbrica .

Come possiamo progettare questo problema in modo appropriato?

    
posta Jef Patat 05.04.2017 - 13:58
fonte

2 risposte

2

Non credo che ci sia un modello unico che si adatterebbe alla legge qui. Tuttavia, potresti usare una combinazione di modelli. Ciò di cui hai realmente bisogno non è un creatore di nodi, ma più di un fornitore di nodi.

Il nodo può essere fornito creando uno nuovo o trovando uno esistente e fornendo un riferimento ad esso. Pertanto, dovresti prima astrarre quella funzionalità in una classe, chiamiamola NodeProvider . Questa classe avrebbe istanze di NodeLocator e NodeFactory . Il metodo Get(int id) della classe NodeProvider prima invoca il metodo Get(int id) del membro NodeLocator . Se non individua il nodo esistente, allora il metodo Get(int id) del membro NodeFactory . Ad ogni modo, viene fornito un nodo. Il modello di progettazione che è più simile a, a mio parere, è Modello di facciata .

Lo pseudo codice (senza alcun controllo) è indicato di seguito:

class NodeProvider
{
    private NodeLocator locator = new NodeLocator();
    private NodeFactory factory = new NodeFactory();

    public Node Get(int id)
    {
        Node retVal = null;
        retVal = locator.Get(id);
        if (retVal == null)
        {
            retVal = factory.Get(id);
        }
        return retVal;
    }
}
    
risposta data 05.04.2017 - 15:41
fonte
0

Il modello di fabbrica mi sembra del tutto inadeguato nel tuo scenario. I nodi figli possono essere generati localmente, dai loro nodi genitore (rendendo la produzione infantile una caratteristica del nodo, non è possibile ottenere più naturale di quello). La ricerca dei nodi è qualcosa di completamente diverso / separato. Unire i due in una singola classe non ha senso e violerebbe SRP.

    
risposta data 05.04.2017 - 21:29
fonte