Как сказал Джон, вы можете использовать МОК. Но это справедливо только в том случае, если вы считаете, что хотели бы иметь этот дополнительный уровень развязки в вашем приложении. Также было бы намного проще заглушить / издеваться, если вы используете IoC. Но я знаю, что иногда введение нового движущегося элемента в ваш проект может быть болезненным.
Фабрика действительно могла бы пойти по этому пути. Я бы передавал абстракцию высокого уровня на заводе. Строка или перечисление, которое говорит что-то вроде «FromADatabase» или «FromANetwork». Это до завода, чтобы найти соответствующие детали конструкции для того, что вы хотите (из файла конфигурации, например), построить необходимый конкретный объект и передать его обратно.
Итак, что касается потребителей, они идут на фабрику и говорят что-то очень высокое, например, мне нужно что-то оттуда, чтобы это сделать. Задача фабрики - выяснить, как создать конкретную реализацию того, что запрашивается, и передать ее вызывающей стороне.