public class Number : Value
public override string ToString()
return "Number: " + n.ToString();
public interface IGenerator {}
public abstract class Generator<T> : IGenerator
public int Columns { get; private set; }
public int Rows { get; private set; }
public Generator(int columns, int rows)
public abstract T GetValue();
public class NumberGenerator : Generator<Number>
public NumberGenerator(int columns, int rows) : base(columns, rows)
public override Number GetValue()
return new Number(Columns * Rows);
public static class Factory
public static T GetGenerator<T>(params object[] args) where T : IGenerator
return (T)Activator.CreateInstance(typeof(T), args);
public static void Main()
var gen = Factory.GetGenerator<NumberGenerator>(5,5);
Number n = gen.GetValue();
Console.WriteLine(n.ToString());