W takich sytuacjach z powodzeniem wprowadziłem (ponownie użyłem) termin „kontekstowy” z czasami wieloma warstwami.
Oznacza to singleton, a więc „globalną” składnicę obiektów, od której można żądać tego rodzaju obiektów. Kody, które ich wymagają, zawierają nagłówek sklepu i używają funkcji globalnych, aby uzyskać instancje obiektów (jak teraz dostawca stopy procentowej).
Sklep może być:
- ściśle wpisane: dołączasz nagłówki dla wszystkich obsługiwanych typów, dzięki czemu możesz tworzyć wpisywane akcesory, takie jak InterestRate getCurrentInterestRate ();
- lub ogólna: Object getObject (enum obType); i rozszerzaj wyliczanie obType o nowe rodzaje (obtypeCurrentInterestRate).
Im większy system, tym bardziej użyteczne jest to drugie rozwiązanie, dla dość małego ryzyka użycia niewłaściwego wyliczenia. Z drugiej strony, w przypadku języków, które umożliwiają deklaracje typu przesyłania dalej, myślę, że można używać wpisywanych akcesoriów bez uwzględnienia wszystkich nagłówków w sklepie.
Jeszcze jedna uwaga: możesz mieć wiele instancji tego samego typu obiektu dla różnych zastosowań, takich jak czasami inna wartość języka dla GUI i dla wydruków, dzienników globalnych i dzienników na poziomie sesji itp., Więc nazwa wyliczenia / akcesorium NIE powinna odzwierciedlać faktycznego typu , ale rola żądanej instancji (CurrentInterestRate).
W implementacji sklepu musisz zarządzać poziomami kontekstu i kolekcjami instancji kontekstu. Prostym przykładem jest usługa internetowa, w której masz kontekst globalny (jedna instancja dla wszystkich żądań dla tego obiektu - problem w przypadku farmy serwerów) oraz kontekst dla każdej sesji internetowej. Możesz także mieć konteksty dla każdego użytkownika, który może mieć wiele równoległych sesji itp. Przy wielu serwerach powinieneś używać do tego rodzaju rozproszonej pamięci podręcznej.
Po nadejściu żądania decydujesz, na jakim poziomie kontekstu znajduje się żądany obiekt, uzyskaj kontekst dla wywołania. Jeśli obiekt tam jest, odsyłasz go; jeśli nie, tworzysz go i przechowujesz na tym poziomie kontekstu, i zwracasz. Oczywiście zsynchronizuj sekcję tworzenia (i opublikuj ją w rozproszonej pamięci podręcznej). Tworzenie może być konfigurowalne jak wtyczka, najlepiej z językami umożliwiającymi tworzenie instancji obiektów według ich nazw klas (Java, Objective C, ...), ale możesz to zrobić również w C, z bibliotekami podłączanymi z funkcjami fabrycznymi.
Uwaga dodatkowa: obiekt wywołujący NIE powinien wiedzieć zbyt wiele o swoich kontekstach i poziomie kontekstu żądanego obiektu. Powody: 1: łatwo jest popełnić błąd (lub „sprytne sztuczki”), grając z tymi parametrami; 2: poziom kontekstu żądanego może się później zmienić. Przeważnie łączę informacje kontekstowe z wątkiem, więc magazyn obiektów zawiera informacje bez dodatkowych parametrów z żądania.
Z drugiej strony żądanie może zawierać wskazówkę dotyczącą instancji: na przykład uzyskanie stopy procentowej na określony dzień. Powinien to być ten sam „globalny” dostęp, ale wiele instancji w zależności od daty (i wprowadzanie różnych wartości daty do tej samej instancji między zmianami stawek), dlatego zaleca się dodanie do żądania obiektu „podpowiedzi”, używanego przez instancja fabryki, a nie sklep; oraz keyForHint do fabryki, używane przez sklep. Możesz dodać te funkcje później, właśnie wspomniałem.
W twoim przypadku jest to rodzaj przesady (tylko jeden obiekt jest obsługiwany na poziomie globalnym), ale w przypadku dość małego i prostego dodatkowego kodu w tej chwili otrzymujesz mechanizm dla dalszych, być może bardziej skomplikowanych wymagań.
Kolejna dobra wiadomość: jeśli jesteś w Javie, korzystasz z tej usługi od wiosny bez zastanowienia, chciałem tylko wyjaśnić to szczegółowo.