java - 是否可以将类型的协变与抽象工厂模式一起使用

标签 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();
    }
}

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

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

最佳答案

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

  • 如果您通过编程到工厂的接口(interface)来处理工厂,那么实现对您来说是完全隐藏的
  • 另一方面,如果您直接与工厂打交道,则可以避免转换。

关于java - 是否可以将类型的协变与抽象工厂模式一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38163348/

相关文章:

java - 有什么设计模式可以使用吗?

c# - 避免嵌套 try catch block 的模式?

java - java spring项目中gremlin客户端集群的最佳实践是什么

java - asp.net 是否像 java 服务器平台一样容易受到对象序列化的影响

java - 无法从 Jboss 7 中运行的 Web 服务客户端调用 Web 服务方法

JavaFX切换场景

java - FileReader 未找到文件异常

c# - 这是工厂方法创建模式吗?

java - 寻求正确的模式以将相同的规则应用于不同的数据集

oop - 配置系统的设计指南?