Como fazer para substituir Fluxos condicionais por polimorfismo

Boa noite galera como fazer para substituir Fluxo condicional por Polimorfismo.

(favor citar algum exemplo)

Eu quero que um método receba uma String relacionado a um animal,
e em um fluxo condicional decida o barulho a ser imprimido desse animal.

public void fazerBarulho(String animal) {
    if(animal.equals("Cachorro")) {
        System.out.println("Au Au");
    } else if(animal.equals("Galinha")) {
        System.out.println("Có Có");
    } else if(animal.equals("Vaca")) {
        System.out.println("Muuuu");
    } else {
        System.out.println("Animal não identificado.");
    }
}

Agora com o polimorfismo eu poderia criar uma classe pai chamada Animal com um método barulho
e todos animais que vão herdar dela terá que sobrescrever este método de acordo com seu barulho.

public abstract class Animal {
    public abstract void barulho();
}

public class Cachorro extends Animal{
    public void barulho() {
        System.out.println("Au Au");
    }
}

public class Galinha extends Animal{
    public void barulho() {
        System.out.println("Có Có");
    }
}

public class Vaca extends Animal{
    public void barulho() {
        System.out.println("Muuuu");
    }
}

Agora o método fazerBarulho() feito com fluxo condicional poderia ser substituído pelo polimorfismo.
Em vez de testar o parâmetro ele simplesmente recebe um tipo genérico Animal e executa o método barulho que existe nele,
mas o que realmente será executado é o método do animal passado por parâmetro que poderia ser qualquer um que herda de Animal.

public void fazerBarulho(Animal animal) {
    animal.barulho();
}
1 curtida

Outro exemplo: http://www.guj.com.br/java/55885-como-nao-utilizar-if-ou-switch#293436

Obrigado pessoal.