У таких ситуаціях я успішно ввів (повторно) використав термін "контекст" з часом кількома шарами.
Це означає одиночний, таким чином, "глобальний" магазин об'єктів, з якого можна запитувати такі об'єкти. Коди, які вимагають їх, включають заголовок магазину та використовують глобальні функції, щоб отримати їх об'єкти (наприклад, зараз постачальник процентних ставок).
Магазин може бути:
- строго набрано: ви включаєте заголовки для всіх типів, що подаються, і таким чином ви можете створювати типізовані аксесуари, такі як InterestRate getCurrentInterestRate ();
- або загальне: Object getObject (enum obType); і лише розширити enTum enum новими видами (obtypeCurrentInterestRate).
Чим більша система, тим більш зручним є останнє рішення, за досить малого ризику використання неправильної перерахунку. З іншого боку, з мовами, які дозволяють декларувати типи вперед, я думаю, що ви можете використовувати набрані аксесуари, не включаючи всі заголовки в магазин.
Ще одна примітка: у вас може бути кілька примірників одного і того ж типу об'єкта для різних цілей, наприклад, іноді різні значення мови для графічного інтерфейсу та для роздруківки, журнали глобального рівня та сеансу тощо, тому ім'я enum / accessor не повинно відображати фактичний тип , але роль запитуваного екземпляра (CurrentInterestRate).
У реалізації магазину ви повинні керувати рівнями контексту та колекціями екземплярів контексту. Простий приклад - веб-сервіс, де у вас глобальний контекст (один екземпляр для всіх запитів цього об’єкта - проблематичний, коли є ферма серверів) та контекст для кожного веб-сеансу. Ви також можете мати контексти для кожного користувача, який може мати кілька, паралельних сеансів і т. Д. На кількох серверах для таких речей ви повинні використовувати своєрідний розподілений кеш.
Коли запит надходить, ви вирішуєте, на якому рівні контексту запитуваний об’єкт, отримуєте цей контекст для виклику. Якщо об’єкт є, ви відправляєте його назад; якщо ні, ви створюєте та зберігаєте його на тому рівні контексту та повертаєте його. Звичайно, синхронізуйте розділ створення (і опублікуйте його в розподіленому кеші). Створення може бути налаштоване як плагін, найкраще з мовами, що дозволяють створювати екземпляри об'єктів за назвою їх класу (Java, Об'єктив C, ...), але ви можете це робити і в C, а також із підключаються бібліотеками, що мають фабричні функції.
Побічна примітка: абонент НЕ повинен знати занадто багато про власні контексти та рівень контексту запитуваного об'єкта. Причини: 1: легко помилитися (або "розумні хитрощі"), граючи з цими параметрами; 2: рівень контексту запитуваного може змінитися пізніше. Я здебільшого підключаю інформацію про контекст до потоку, тому в сховищі об’єктів є інформація без додаткових параметрів запиту.
З іншого боку, запит може містити натяк на приклад: наприклад, отримання процентної ставки на конкретну дату. Це повинен бути той самий "глобальний" доступ, але декілька примірників залежно від дати (і приведення різних значень дати до одного і того ж екземпляра між змінами ставок), тому доцільно до запиту додати об'єкт "підказки", який використовується примірник фабрика, а не магазин; і ключ для підказки до фабрики, яку використовує магазин. Ви можете додати ці функції пізніше, я щойно згадав.
Для вашого випадку це свого роду надмірність (лише один об’єкт подається на глобальному рівні), але для зовсім невеликого та простого додаткового коду зараз ви отримуєте механізм подальших, можливо, більш складних вимог.
Ще одна добра новина: якщо ви перебуваєте на Java, ви отримуєте цю послугу від Spring, не надто замислюючись, я просто хотів пояснити її детально.