Боюсь, не смогу дать чёткого решения проблемы, слишком мало данных. Но может, мой опыт пригодится.
В своё время делал комплексную систему безопасности. Это был коробочный продукт, при мне выпустили 4 версии. В системе требовалось привязать кучу оборудования: видеокамеры, считыватели, СКУД, сканеры документов и прочую снедь. Проблему решили просто: были созданы унифицированные абстрактные классы под каждый класс оборудования: для сканеров (получение сканов документов), под СКУД (информация о проходах), под считыватели (события чтения карт, билетов, биометрии), под камеры (получение видео и фотоизображений), под системы распознавания изображений... Абстрактные классы имели абстрактные методы для получения входных данных и реализацию методов дальнейшей обработки информации, соответствующих данному классу устройств. Реализация конкретных классов для конкретных моделей устройств была вытащена в плагины, которые подцеплялись динамически.
Мы всегда знали, какие устройства поддерживаем, и делали под них соответствующие плагины. Интерфейсы и абстрактные классы переделывать было не нужно, они не менялись. Допустим, было несколько считывателей: магнитные карты нескольких типов, билеты со штрих-кодом, отпечатки пальцев... Но они все были нужны, чтобы выполнить одну функцию: опознать владельца предъявленного идентификатора. Поэтому реализация плагина была для каждого устройства своя, а вот интерфейс его взаимодействия с ядром системы - один на все устройства.