En general, cuando sabe qué base de datos está utilizando su empresa o usted, se dirige a ese tipo de base de datos específico. Si conoce su Oracle, entonces usa las clases relacionadas con Oracle, si es SQLClient, luego usa SqlClient, y así sucesivamente.
Ahora, si no está seguro de qué tipo es, entonces buscaría una forma de referencia genérica/generalizada, para que pueda lograr su objetivo sin tener que preocuparse por el tipo de base de datos. A la inversa, escribiría un montón de enunciados condicionales para verificar el tipo de base de datos y luego realizar operaciones según el mismo.
Un escenario común para ayudarlo a entender sería: Si está escribiendo código, para que su usuario final pueda cambiar el archivo de configuración e ingresar una cadena de conexión para conectarse a la base de datos, ¿cuál proporcionaría usted estaría utilizando? Este es el lugar donde DbFactory y sus clases relevantes son útiles, donde en lugar de escribir fragmentos de código, utilizas la clase genérica (algo así como supongo) para manejar todo.
Tenga en cuenta que si se dirige a un proveedor específico, tendrá un mejor rendimiento (ya que DbFactory debe resolver su proveedor internamente antes de manejarlo), pero si no está seguro del proveedor del usuario final, entonces su código ser grande y no ser eficiente.
Llegando a su otra pregunta: Resumen o concreto. Está hasta ti y de nuevo, está basado en el ESCENARIO. La ventaja del resumen es que puede FORCE/ATACAR al cliente contra reglas (como una interfaz) y generalizar cosas, así como utilizar el tipo de conversión (similar a clases concretas) para acceder a métodos de subclase para hacer algo (consultar sobre este tema si puedes.Utilizando el polimorfismo de tiempo de ejecución, puede usar un objeto y llamar a un método que tenga diferentes implementaciones en diferentes clases subclasificadas a esta clase principal, de la que nunca tendrá que preocuparse, como el cálculo de interés tal vez interés simple e interés compuesto para un banco, que son calculados por la clase respectiva, pero no te importa, ya que solo dices: GetInterest() y boom!).
Apuntando ambos, diría que, en un escenario donde no se conoce el tipo de Base de datos que está utilizando el usuario final, y sin conocer la cadena de conexión, es posible que desee obligar al usuario final a implementar su clase, IMPLEMENTE su método abstracto para inicializar la cadena de conexión y luego realice la operación necesaria para obtener una salida.
Espero que ayude.