public static void Main()
var opt1 = new Options();
var fac = ConnectionFactory.GetInstance().CreateConnection(opt1);
Console.WriteLine("ConnectionFactory options: " + opt1.ConnectionString);
var opt2 = new Options();
fac = AdvancedConnectionFactory.GetInstance().CreateConnection(opt2);
Console.WriteLine("AdvancedConnectionFactory options: " + opt2.ConnectionString);
public abstract class ConnectionFactoryBase<T> where T : class, new()
private static T _instance;
public static T GetInstance()
public abstract Connection CreateConnection(Options options);
protected void AddTemplate(Options options)
options.ConnectionString = "some templated string";
Console.WriteLine("AddTemplate");
public class ConnectionFactory : ConnectionFactoryBase<ConnectionFactory>
public override Connection CreateConnection(Options options)
return IntermediateMethod1(options);
private Connection IntermediateMethod1(Options options)
return new Connection(options);
public class AdvancedConnectionFactory : ConnectionFactoryBase<AdvancedConnectionFactory>
public override Connection CreateConnection(Options options)
return CreateAdvancedConnection(options);
public AdvancedConnection CreateAdvancedConnection(Options options)
return new AdvancedConnection(options);
public Connection(Options options) {}
public class AdvancedConnection : Connection
public AdvancedConnection(Options options)
public string ConnectionString;