In tali situazioni ho introdotto con successo (riutilizzato) il termine "contesto" con a volte più livelli.
Questo significa un singleton, quindi un "object" globale, da cui è 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 oggetto (come ora, il fornitore di tasso di interesse).
Il negozio può essere:
- tipizzato rigorosamente: includi le intestazioni per tutti i tipi serviti e quindi puoi creare accessors digitati, come InterestRate getCurrentInterestRate ();
- o generico: oggetto getObject (enum obType); e solo estendere obType enum con i nuovi tipi (obtypeCurrentInterestRate).
Più grande è il sistema, più è utilizzabile quest'ultima soluzione, per un rischio piuttosto ridotto di usare l'enum sbagliato. D'altra parte, con le lingue che consentono dichiarazioni di tipo forward, penso che sia possibile utilizzare accessors digitati senza includere tutte le intestazioni nel negozio.
Un'altra nota: potresti avere più istanze dello stesso tipo di oggetto per usi diversi, ad esempio il valore della lingua a volte diverso per la GUI e per la stampa, i registri 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, devi gestire i livelli di contesto e le raccolte di istanze del 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 un tipo 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 rimandi; in caso contrario, lo crei e lo memorizzi a quel livello di contesto e lo restituisci. Ovviamente, sincronizzare la sezione di creazione (e pubblicarla nella cache distribuita). La creazione può essere configurabile come plug-in, meglio con i linguaggi permettendo la creazione di istanze di oggetti con il loro nome di classe (Java, Objective C, ...), ma è possibile farlo anche in C con le librerie collegabili con funzioni di fabbrica.
Nota a margine: il chiamante NON deve conoscere troppo i propri contesti e il livello di contesto dell'oggetto richiesto. Motivi: 1: è facile fare errori (o "trucchi intelligenti") giocando con questi parametri; 2: il livello di contesto richiesto potrebbe cambiare in seguito. Per lo più collego le informazioni di contesto al thread, quindi l'archivio oggetti ha le informazioni senza parametri aggiuntivi dalla richiesta.
D'altra parte, la richiesta potrebbe contenere suggerimenti 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 diversi valori di data alla stessa istanza tra le variazioni di velocità), quindi è consigliabile aggiungere un oggetto "suggerimento" alla richiesta, utilizzato dal istanza di fabbrica e non il negozio; e un keyForHint alla fabbrica, usato dal negozio. Puoi aggiungere queste funzioni in seguito, ho appena citato.
Per il tuo caso questo è un tipo di overkill (solo un oggetto è servito a livello globale), ma per un codice extra abbastanza piccolo e semplice in questo momento, ottieni un meccanismo per ulteriori, forse più complessi requisiti.
Un'altra buona notizia: se sei in Java, ricevi questo servizio da Spring senza pensare troppo, volevo solo spiegarlo in dettaglio.