Согласно принципам SOLID класс не может зависеть от других классов, зависимости должны быть введены. Это просто:
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Но что, если я хочу, чтобы мой класс Foo мог создавать Bar, не зная точной реализации IBar? Я могу придумать здесь 4 решения, но все они, похоже, имеют недостатки:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
Последний случай кажется естественным, но у класса BarCreator слишком мало кода. Как вы думаете, что лучше?