using System; public class Test { public static void Main() { var concreteMapperFactory = new ConcreteMapperFactory(); concreteMapperFactory.GetMapper(new Box()); if (concreteMapperFactory.concreteCalled) { Console.WriteLine("Concrete called"); } if (concreteMapperFactory.templateCalled) { Console.WriteLine("Template called"); } } public interface IShape { } public class Circle:IShape{} public class Box: IShape{} public abstract class AbstractMapperFactory { public abstract void GetMapper(TSource obj) where TSource : class; } class ConcreteMapperFactory: AbstractMapperFactory { public bool concreteCalled; public bool templateCalled; public void GetMapper(Box box) { concreteCalled = true; } public override void GetMapper(TSource obj) { templateCalled = true; } }}