public abstract class Product
public class SimpleProduct: Product
public class SimpleProduct2: Product
public T CreateProduct<T>() where T: Product, new()
public static void Main()
var factory = new Factory();
var p = factory.CreateProduct<SimpleProduct>();
var p2 = factory.CreateProduct<SimpleProduct2>();