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

时间:2016-07-02 18:38:14

标签: java design-patterns

我正在学习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();
    }
}

我使用了类型的协方差,因此工厂方法返回具体产品而不是抽象产品(Animal)。

我喜欢它,但这并不违反关于从客户端封装产品的经验法则吗?或者我可能会过度思考这个问题。

1 个答案:

答案 0 :(得分:3)

在这种情况下使用协方差是很好的。这是展示Java中协变覆盖功能的完美案例,因为它可以让您拥有两全其美的优势:

  • 如果您通过编程到其界面来处理工厂,那么实施对您来说是完全隐藏的
  • 另一方面,如果你直接与工厂打交道,你可以避免演员表。