Инверсия зависимостей. Создание объекта

Согласно принципам SOLID класс не может зависеть от других классов, зависимости должны быть введены. Это просто:

class Foo
{
    public Foo(IBar bar)
    {
        this.bar = bar;
    }

    private IBar bar;
}

interface IBar 
{
}

class Bar: IBar 
{
}

Но что, если я хочу, чтобы мой класс Foo мог создавать Bar, не зная точной реализации IBar? Я могу придумать здесь 4 решения, но все они, похоже, имеют недостатки:

  1. введение типа объекта и использование отражения
  2. с использованием Generics
  3. с использованием «Service Locator» и вызовом метода Resolve ().
  4. создание отдельного фабричного класса и внедрение его в Foo:

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 слишком мало кода. Как вы думаете, что лучше?

8
задан Uwe Keim 26 August 2011 в 11:29
поделиться