In tali situazioni ho introdotto con successo (riutilizzato) il termine "contesto" con a volte più livelli.
Ciò significa un singleton, quindi un negozio di oggetti "globale", dal quale è possibile richiedere questo tipo di oggetti. I codici che li richiedono, includono l'intestazione del negozio e usano le funzioni globali per ottenere le loro istanze di oggetti (come ora, il fornitore di tassi di interesse).
Il negozio può essere:
- tipizzato rigorosamente: includi le intestazioni per tutti i tipi serviti e quindi puoi creare accessi tipizzati, come InterestRate getCurrentInterestRate ();
- o generico: Object getObject (enum obType); ed estendere l'enum obType solo con i nuovi tipi (obtypeCurrentInterestRate).
Più grande è il sistema, più utilizzabile quest'ultima soluzione, con un rischio piuttosto piccolo di usare l'enum sbagliato. D'altra parte, con le lingue che consentono dichiarazioni di tipo forward, penso che tu possa usare gli accessi digitati senza includere tutte le intestazioni nel negozio.
Un'altra nota: potresti avere più istanze dello stesso tipo di oggetto per usi diversi, come a volte valore della lingua diverso per la GUI e per i log di stampa, globali e di sessione, ecc., Quindi il nome enum / accessor NON deve riflettere il tipo effettivo , ma il ruolo dell'istanza richiesta (CurrentInterestRate).
Nell'implementazione del negozio, è necessario gestire i livelli di contesto e le raccolte di istanze di contesto. Un semplice esempio è il servizio Web, in cui si ha il contesto globale (un'istanza per tutte le richieste per quell'oggetto - problematico quando si ha una server farm) e un contesto per ogni sessione web. Puoi anche avere contesti per ogni utente, che può avere più sessioni parallele, ecc. Con più server dovresti usare una specie di cache distribuita per tali cose.
Quando arriva la richiesta, decidi quale livello di contesto è l'oggetto richiesto, ottieni quel contesto per la chiamata. Se l'oggetto è lì, lo rispedisci; in caso contrario, lo crei e lo memorizzi a quel livello di contesto e lo restituisci. Naturalmente, sincronizza la sezione di creazione (e pubblicala nella cache distribuita). La creazione può essere configurabile come plug-in, preferibilmente con linguaggi che consentono di creare istanze di oggetti in base al nome della loro classe (Java, Obiettivo C, ...), ma è possibile farlo anche in C con librerie collegabili con funzioni di fabbrica.
Nota a margine: il chiamante NON dovrebbe conoscere troppo i propri contesti e il livello di contesto dell'oggetto richiesto. Ragioni: 1: è facile commettere errori (o "trucchi intelligenti") giocando con questi parametri; 2: il livello di contesto della richiesta potrebbe cambiare in seguito. Collego principalmente informazioni di contesto al thread, quindi l'archivio oggetti ha le informazioni senza parametri aggiuntivi dalla richiesta.
D'altra parte, la richiesta può contenere un suggerimento per l'istanza: come ottenere il tasso di interesse per una data specifica. Dovrebbe essere lo stesso accesso "globale", ma più istanze a seconda della data (e portando valori di data diversi alla stessa istanza tra le variazioni di tasso), quindi è consigliabile aggiungere un oggetto "suggerimento" alla richiesta, utilizzato da fabbrica dell'istanza e non il negozio; e un keyForHint per la fabbrica, utilizzato dal negozio. È possibile aggiungere queste funzioni in seguito, ho appena accennato.
Nel tuo caso si tratta di una sorta di overkill (solo un oggetto viene offerto a livello globale), ma per un codice aggiuntivo piuttosto piccolo e semplice in questo momento, ottieni un meccanismo per ulteriori, forse requisiti più complessi.
Un'altra buona notizia: se sei in Java, ottieni questo servizio da Spring senza pensarci troppo, volevo solo spiegarlo in dettaglio.