我正在从 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 中协变覆盖的强大功能的完美案例,因为它可以让您两全其美:
- 如果您通过编程到工厂的接口(interface)来处理工厂,那么实现对您来说是完全隐藏的
- 另一方面,如果您直接与工厂打交道,则可以避免转换。
关于java - 是否可以将类型的协变与抽象工厂模式一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38163348/