Я думаю, что смысл в следующем: «Как много деталей низкого уровня должен знать клиент?».
Если вы выбираете первое решение (абстрактный базовый класс), вы скрываете больше деталей для клиентского класса. Таким образом, клиент может полностью игнорировать детали низкого уровня (протокол, формат внешнего ресурса.). Когда цель состоит в том, чтобы полностью скрыть детали реализации и типы, используемые внутри этой реализации, я предпочитаю этот подход.
В противном случае, если клиент уже осведомлен о некоторых деталях реализации низкого уровня (например, клиент знает, что сокет, который он будет использовать, является UDP, и он также ХОЧЕТ знать такую информацию), тогда подход абстрактного базового класса может быть заменен внутренней "фабрикой стратегии".