static void Main(string[] args) { ProblemFactory problemFactory = new ProblemFactory(); BinaryLevelConfiguration binaryLevelConfig = new BinaryLevelConfiguration(); // register your factory functions problemFactory.RegisterProblem <BinaryProblem>((level) => new BinaryProblem(binaryLevelConfig.GetProblemConfiguration(level))); // consume them IProblem problem1 = problemFactory.GenerateProblem <BinaryProblem>(Level.Easy); IProblem problem2 = problemFactory.GenerateProblem <BinaryProblem>(Level.Hard); }