В нашем проекте у нас есть класс KnowledgeBaseManager, который используется другими классами следующим образом:
KnowledgeBaseManager manager = KnowledgeBaseManager.get();
manager.foo();
KnowledgeBaseManager содержит статическую переменную standardKnowledgeBaseManager, которая инициализируется при первом использовании:
class KnowledgeBaseManager {
private static KnowledgeBaseManager standardKnowledgeBaseManager = null;
public static KnowledgeBaseManager get() {
if (standardKnowledgeBaseManager == null) {
standardKnowledgeBaseManager = new KnowledgeBaseManager();
// initialize standardKnowledgeBaseManager with appropriate knowledge base
}
return standardKnowledgeBase;
}
Кроме того, у нас есть параметризованный конструктор
public static KnowledgeBaseManager get(OntModel model) {...}
, который мы используем до сих пор только для модульного теста, где нам нужен KnowledgeBaseManager с базой знаний теста в фоновом режиме.
Теперь перед нами стоит следующая задача: для разработки мы хотим, чтобы приложение использовало KB-менеджер с другой базой знаний в фоновом режиме (из-за скорости).Чтобы быть более конкретным, мы создаем веб-приложение с Wicket.Поэтому мы хотим объявить где-то в начале приложения, какая база знаний и KnowledgeBaseManager используются в приложении (в зависимости от того, где мы находимся в процессе разработки или развертывания).Код для использования KB-менеджера (например,
KnowledgeBaseManager manager = KnowledgeBaseManager.get();
сейчас) не должен быть изменен для этого.
Вопрос в том, какая архитектура лучше для этого?
Я думал об использовании структуры внедрения зависимостей, такой как PicoContainer или Guice, но у меня нет никакого опыта с этим, и я не уверен, будет ли это накладными расходами для этой конкретной проблемы.Какие-либо предложения для лучших практик в нашем случае?