Здравствуйте, okon, Вы писали:
O>Вот так не хотелось бы делать, т.к. жестко задается имплементация Foo, Bar и сложно для подмены для тех же тестов.
Так и не надо. Фабрика знает конкретные типы (тип) и создает только какую-то свою группу объектов (или один объект). Все они связаны целью, логически и т.д.
Все что надо для создания этой группы — зависимости уже фабрики. И знать эти типы фабрика не должна. Т.е.
public class MyFabric : IMyFabric
{
public MyFabric (IFoo foo, IBar bar) { … }
public ISomething CreateSomething (int i)
{
return new Something (i, foo, bar);
// или например
// return new Something (foo(i), bar);
}
}
PS: Кстати, service locator IMHO не всегда антипаттерн. В некоторых случаях он вполне применим. Но, наверное, это тема для отдельного разговора.