O padrão Factory Method abstrai o processo de tomada de decisão da classe de chamada. Isso tem várias vantagens:
Reuso. Se eu quero instanciar em muitos lugares, não preciso repetir minha condição; portanto, quando adiciono uma nova classe, não corro o risco de perder uma.
Testabilidade unitária. Posso escrever 3 testes para a fábrica, para garantir que ele retorne os tipos corretos nas condições corretas, então minha classe de chamada precisa ser testada para ver se chama a fábrica e os métodos necessários na classe retornada. Ele não precisa saber nada sobre a implementação da própria fábrica ou sobre as classes de concreto.
Extensibilidade. Quando alguém decide que precisamos adicionar uma nova classe D a esta fábrica, nenhum código de chamada, nem testes de unidade ou implementação, precisa ser informado. Simplesmente criamos uma nova classe D e estendemos nosso método de fábrica. Esta é a própria definição de Princípio Aberto-Fechado .
Você pode até criar uma nova classe de fábrica e transformá-la em hot-swap, se a situação exigir - por exemplo, se você quiser ativar e desativar a classe D durante o teste. Encontrei essa situação apenas uma vez, mas foi extremamente útil.
Como já foi dito, o Padrão de Fábrica nem sempre é o caminho a percorrer. Mas, sempre que vir instanciação condicional, você deve pensar um pouco.