我正在学习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)。
我喜欢它,但这并不违反关于从客户端封装产品的经验法则吗?或者我可能会过度思考这个问题。
答案 0 :(得分:3)
在这种情况下使用协方差是很好的。这是展示Java中协变覆盖功能的完美案例,因为它可以让您拥有两全其美的优势: