En tales situaciones, he introducido (reutilizado) con éxito el término "contexto" con a veces múltiples capas.
Esto significa un singleton, por lo tanto, un almacén de objetos "global", desde el cual se puede solicitar este tipo de objetos. Los códigos que los requieren, incluyen el encabezado de la tienda y usan las funciones globales para obtener sus instancias de objeto (como ahora, el proveedor de tasas de interés).
La tienda puede ser:
- estrictamente tipado: incluye los encabezados para todos los tipos servidos y, por lo tanto, puede crear accesores tipados, como InterestRate getCurrentInterestRate ();
- o genérico: Object getObject (enum obType); y solo extienda la enumeración obType con los nuevos tipos (obtypeCurrentInterestRate).
Cuanto más grande es el sistema, más utilizable es la última solución, por un riesgo bastante pequeño de usar la enumeración incorrecta. Por otro lado, con idiomas que permiten declaraciones de tipo de reenvío, creo que puede usar los accesos escritos sin incluir todos los encabezados de la tienda.
Una nota más: puede tener varias instancias del mismo tipo de objeto para diferentes usos, como a veces un valor de idioma diferente para la GUI y para la impresión, registros globales y de nivel de sesión, etc., por lo que el nombre de enumeración / acceso NO debe reflejar el tipo real , pero el rol de la instancia solicitada (CurrentInterestRate).
En la implementación de la tienda, debe administrar los niveles de contexto y las colecciones de instancias de contexto. Un ejemplo simple es el servicio web, donde tiene el contexto global (una instancia para todas las solicitudes de ese objeto, problemático cuando se tiene una granja de servidores) y un contexto para cada sesión web. También puede tener contextos para cada usuario, que puede tener múltiples sesiones paralelas, etc. Con múltiples servidores, debe usar una especie de caché distribuida para tales cosas.
Cuando llega la solicitud, usted decide qué nivel de contexto es el objeto solicitado, obtenga ese contexto para la llamada. Si el objeto está allí, lo devuelve; si no, lo crea y lo almacena en ese nivel de contexto, y lo devuelve. Por supuesto, sincronice la sección de creación (y publíquela en el caché distribuido). La creación puede ser configurable como un complemento, mejor con lenguajes que permiten crear instancias de objetos por su nombre de clase (Java, Objective C, ...), pero puede hacerlo en C también con bibliotecas conectables que tienen funciones de fábrica.
Nota al margen: la persona que llama NO debe saber demasiado sobre sus propios contextos y el nivel de contexto del objeto solicitado. Motivos: 1: es fácil cometer errores (o "trucos ingeniosos") jugando con estos parámetros; 2: el nivel de contexto de lo solicitado podría cambiar más adelante. Principalmente conecto información de contexto al hilo, por lo que el almacén de objetos tiene la información sin parámetros adicionales de la solicitud.
Por otro lado, la solicitud puede contener una pista para la instancia: como obtener la tasa de interés para una fecha específica. Debe ser el mismo acceso "global", pero múltiples instancias dependiendo de la fecha (y llevando diferentes valores de fecha a la misma instancia entre cambios de velocidad), por lo que es aconsejable agregar un objeto "sugerencia" a la solicitud, utilizado por el instancia de fábrica y no la tienda; y un keyForHint para la fábrica, utilizado por la tienda. Puede agregar estas funciones más tarde, acabo de mencionar.
Para su caso, esto es una especie de exageración (solo se sirve un objeto a nivel global), pero para un código adicional bastante pequeño y simple en este momento, obtiene un mecanismo para requisitos adicionales, quizás más complejos.
Otra buena noticia: si estás en Java, obtienes este servicio de Spring sin pensar demasiado, solo quería explicarte en detalle.