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