Идея интерфейса разумна. Объедините его с фабрикой, которая может создать требуемый экземпляр реализации в зависимости от некоторого внешнего ввода, например. г. идентификатор арендатора. Если вам не нужно поддерживать несколько арендаторов в одном и том же запущенном экземпляре приложения, вы также можете использовать что-то вроде ServiceLocator
из JDK, что позволяет использовать подход конфигурации на основе файлов.
Если вы работаете на сервере приложений, попробуйте запустить несколько экземпляров, каждый из которых настроен для отдельного клиента. Сервер тогда позаботится о разделении экземпляров, просто отлично.
В противном случае, если вы действительно думаете, что вам нужно одновременно использовать несколько реализаций (во время выполнения) в приложении EE, отличном от Java, это сложная проблема. Возможно, вы захотите взглянуть на контейнеры OSGi, которые предоставляют функции для нескольких версий класса. Однако такой подход добавляет значительную сложность, если вы еще не знакомы с ним.