¿Cómo debo seleccionar qué implementación concreta se debe instanciar en función de la elección del usuario?

Tengo una interfazFruit con dos implementacionesApple yBanana. Quiero crear unFruit ejemplo. La elección de si la implementación concreta debe ser unApple o unBanana debe ser realizado por el usuario. Todavía no diseñé la interfaz de usuario, por lo que no hay restricciones sobre cómo el usuario toma esta decisión.

Sé que hay las siguientes opciones:

uso del patrón abstracto de fábricauso de la reflexión para crear una instancia a partir de un nombre de clase dadouso de la reflexión para crear una instancia a partir de un objeto de clase dado

¿Cuáles son los pros y los contras de estas opciones?

Tenga en cuenta que si bien hay varias preguntas similares que discuten el enfoque de uno u otro, no encontré una sola comparación.

Aquí hay una lista de preguntas relacionadas:

¿Por qué Class.newInstance () es "malvado"?¿Puedo usar Class.newInstance () con argumentos de constructor?¿Cómo hacer una ArrayList of Classes?¿Class.newInstance () sigue el patrón de diseño "Fábrica abstracta"?

Respuestas a la pregunta(1)

Su respuesta a la pregunta