Я имею в виду «инфраструктуру поставщика услуг», как обсуждалось в главе 2 «Эффективной Java» , которая кажется совершенно правильным способом решения возникающей у меня проблемы, когда мне нужно создать экземпляр одного из нескольких классов во время выполнения на основе String
для выбора какой службы и объекта Configuration
(по сути, фрагмента XML):
Но как мне заставить отдельных провайдеров услуг (например, группу провайдеров по умолчанию + некоторых нестандартных провайдеров) зарегистрироваться самостоятельно?
interface FooAlgorithm
{
/* methods particular to this class of algorithms */
}
interface FooAlgorithmProvider
{
public FooAlgorithm getAlgorithm(Configuration c);
}
class FooAlgorithmRegistry
{
private FooAlgorithmRegistry() {}
static private final Map<String, FooAlgorithmProvider> directory =
new HashMap<String, FooAlgorithmProvider>();
static public FooAlgorithmProvider getProvider(String name)
{
return directory.get(serviceName);
}
static public boolean registerProvider(String name,
FooAlgorithmProvider provider)
{
if (directory.containsKey(name))
return false;
directory.put(name, provider);
return true;
}
}
например. если я напишу пользовательские классы MyFooAlgorithm и MyFooAlgorithmProvider для реализации FooAlgorithm, и я распространю их в банке, есть ли способ получить автоматический вызов registerProvider, или мои клиентские программы, использующие алгоритм, должны явно вызывать FooAlgorithmRegistry.registerProvider () для каждого класса, который они хотят использовать?