Реализуем обобщенную фабрику

public interface IFactory<TContext, TObject>
{
        TObject Create(TContext context);
}

public class DefaultFactory<TContext, TObject> : IFactory<TContext, TObject>
{
    private Func<TContext, TObject> _factory;
    public DefaultFactory()
    {
    }
    public DefaultFactory(Func<TContext, TObject> factory)
    {
        _factory = factory;
    }
    public virtual TObject Create(TContext context)
    {
        if (_factory == null)
            throw new NotImplementedException("It is necessary to implement factory method.");

        return _factory(context);
    }
}

Реализация готова! Осталось привести пример :). Допустим есть такой абстрактный и производный класс:

public abstract class Product
{
    public abstract string Name { get; }
}

public class MyProduct : Product
{
    public override string Name { get; } = "My product";
}

Создадим фабрику на основе лямбда выражения. Такая фабрика очень хороша, когда не имеет зависимостей, которые нужно разрешить. После создания такую фабрику можно зарегистрировать сразу в DI контейнере.

var productFactory = new DefaultFactory<string, Product>((context) => new MyProduct());

И создадим полноценную фабрику с разрешением зависимостей:

public class ProductFactory: DefaultFactory<string, Product>
{
    private IDependencyService _dependencyService;
    public ProductFactory(IDependencyService dependencyService)
    {
        _dependencyService = dependencyService
    }
    public override Product Create(string context)
    {
        return new MyProduct(_dependencyService);
    }
}

var productFactory = new ProductFactory();