Java 在运行时分配具体的实现对象

Java Assign the concrete implementation object at runtime

我正在阅读超类型编程部分中的 Head First Design Patterns 一书。 书中解释说,最佳实践是使用函数 getAnimal()。 疑问:

以下是本书的节选:

“编程实现将是:

Dog d = new Dog();
d.bark();

但是编程为 interface/supertype 将是:

Animal animal = new Dog();
animal.makeSound();

更好,而不是硬编码的实例化 子类型(如 new Dog())到代码中,分配具体的 运行时的实现对象:

a = getAnimal();
a.makeSound();

这是我目前所知道的,但是我不确定我是否清楚地理解了这个概念,这种类型的实现会是书中的意思吗?

abstract class Animal {
    abstract void makeSound();
}
public class Dog extends Animal{
    void bark(){
        System.out.println("Bark");
    }

    @Override
    void makeSound() {
        bark();
    }
    public static void main(String[] args){
        Animal animal=new Dog();
        animal.makeSound();
    }
        
}

public class ConcreteAnimal extends Animal {
    Animal animal;

    @Override
    void makeSound() {
        animal.makeSound();
    }

    Animal getAnimal() {
        Animal dog = new Dog();// Is this correct?
        return dog;
    }

    public static void main(String[] args) {
        ConcreteAnimal ca = new ConcreteAnimal();
        Animal a = ca.getAnimal();// How to call getAnimal() without an object nor class name?
        a.makeSound();//It prints the Bark as expected.
    }
}

谢谢

使用工厂方法模式创建 Animal 对象。使用 AnimalFactoryDe​​mo class 而不是 ConcreteAnimal class。它应该看起来像这样:

public class AnimalFactoryDemo 
{
    public static void main(String[] args) 
    {
      Animal animal = AnimalFactory.getAnimal("Dog");
      animal.makeSound();
    }
}

public class AnimalFactory 
{
   public static Animal getAnimal(String Animal) 
   {
     if (type.equals("Dog"))
        return new Dog();
     else if (type.equals("Cat"))
        return new Cat();
     else
        return null;
    }  
}