Java 使用抽象工厂模式的类型协方差可以吗

Java 使用抽象工厂模式的类型协方差可以吗,java,design-patterns,Java,Design Patterns,我正在从GOF的书中学习设计模式 抽象工厂模式的实现有一点让我很困惑。我将从代码开始: 摘要工厂: public interface AnimalsFactory { Animal getWaterAnimal(); Animal getLandAnimal(); Animal getFlyingAnimal(); } 混凝土厂: public class SafariAnimalsFactory implements AnimalsFactory {

我正在从GOF的书中学习设计模式

抽象工厂模式的实现有一点让我很困惑。我将从代码开始:

摘要工厂:

public interface AnimalsFactory {

    Animal getWaterAnimal();

    Animal getLandAnimal();

    Animal getFlyingAnimal();
}
混凝土厂:

public class SafariAnimalsFactory implements AnimalsFactory {

    @Override
    public Hippo getWaterAnimal() {
        return new Hippo();
    }

    @Override
    public Giraffe getLandAnimal() {
        return new Giraffe();
    }

    @Override
    public Vulture getFlyingAnimal() {
        return new Vulture();
    }
}
我使用了类型的协方差,所以工厂方法返回具体的产品,而不是抽象的产品(动物)


我喜欢它,但这是否违反了从客户端封装产品的经验法则?或者我想得太多了。

在这种情况下使用协方差是很好的。这是在Java中演示协变覆盖功能的一个完美例子,因为它可以让您在两个方面都做到最好:

  • 如果您通过对工厂接口编程来处理工厂,那么实现对您来说是完全隐藏的
  • 另一方面,如果你直接与工厂打交道,你可以避免铸造

    • 狮子会飞的动物()
      -因为狮子会飞fly@SvetlinZarev不知怎的,我错过了那个xD。。。