Поскольку вы упоминаете зрелую базу, я бы хотел привести еще один пример из реальной жизни: Сессия Hibernate.
Session - это интерфейс, реализованный только одним классом: SessionImpl . Однако, если вы использовали спящий режим в прошлом или читали его исходный код, вы, вероятно, заметили, как Session используется везде вместо SessionImpl.
Это неправильный дизайн? Определенно нет. Это называется «принцип замещения» или «программирование на интерфейсы». Это означает, что, используя интерфейс вместо реализации, вы можете расширить свой код без каких-либо усилий, просто создав соответствующие экземпляры новых классов, но всегда используя интерфейс. Будет ли все еще неправильно, если никто не создаст новый класс, реализующий Session? Нет, все еще не так.
Мои два цента.