Como devo selecionar qual implementação concreta deve ser instanciada com base na escolha do usuário?

Eu tenho uma interfaceFruit com duas implementaçõesApple eBanana. Eu quero criar umFruit instância. A escolha de se a implementação concreta deve ser umApple ou umBanana deve ser feita pelo usuário. Ainda não projetei a interface do usuário, portanto não há restrições sobre como essa escolha é feita pelo usuário.

Eu sei que existem as seguintes opções:

uso do padrão abstrato de fábricauso de reflexão para criar uma instância a partir de um determinado nome de classeuso de reflexão para criar uma instância de um determinado objeto de classe

Quais são os prós e os contras dessas opções?

Observe que, embora existam várias perguntas semelhantes que discutem uma ou outra abordagem, não encontrei uma única comparação.

Aqui está uma lista de perguntas relacionadas:

Por que Class.newInstance () é "mau"?Posso usar Class.newInstance () com argumentos de construtor?Como criar uma ArrayList de classes?Class.newInstance () segue o padrão de design "Fábrica abstrata"?

questionAnswers(1)

yourAnswerToTheQuestion