【问题标题】:How can I extend classes in Factory Method pattern in Java如何在 Java 中扩展工厂方法模式中的类
【发布时间】:2021-01-13 14:07:13
【问题描述】:

我是设计模式的新手,现在我正在学习工厂方法模式。我尝试用动物做一个例子。

我有一个 Animal 接口,它有两种方法,呼吸和行走。实现这个接口我有两个类,Giraffe 和 Flamingo。

按照这种模式,我有两个工厂,一个用于长颈鹿,一个用于火烈鸟,还有一个像这样的主类:

if (color.equals("yellow")) {
  factory = new GiraffeFactory();
} else {
  factory = new FlamingoFactory();
}

Animal animal = factory.createAnimal();
animal.breathe();
animal.walk();

这很好用,但现在我意识到火烈鸟会飞。我不想在 Animal 接口中包含这个方法,因为 Giraffes 不能。

我怎样才能只在 Flamingo Animal 实例中调用这个新方法?铸造是唯一的解决方案吗?还是这种模式仅适用于在其接口中具有相同方法的对象?

((Flamingo) animal).fly();

非常感谢。

【问题讨论】:

  • 您可以创建一个扩展AnimalFlyingAnimal 接口。重点是您在每种情况下都需要的:如果您需要一个接收Animal 的方法让他飞起来(调用.fly()),那么您实际上期待的是FlyingAnimal,而不仅仅是Animal,所以您必须更改方法签名才能接收FlyingAnimal

标签: java design-patterns factory-method


【解决方案1】:

好吧,这种模式的使用没有多大意义,关键是你不知道你会得到什么样的 Animal 实现(职责分离),所以使用知识。你可以做一个新的接口Winged之类的,让Flamingo实现它。然后你可以随时检查。请记住,蝙蝠在想到名字时也会飞;)

if (animal instanceof Winged) {
    Winged winged = (Winged) animal;
    winged.fly();
}

【讨论】:

  • 为了清楚起见,我为您提出的具体问题提供了一个解决方案(无论多么抽象),但是设计模式的整个想法是提高代码的清晰度、可读性和可用性,所以通常是这样的——具体你想采取什么方法
【解决方案2】:

您可以创建另一个名为 WingedAnimal 的接口来扩展 Animal。

public interface WingedAnimal extends Animal { 
   public void fly();
}

public class Flamingo implements WingedAnimal {
   @Override
   public void breath() {}
   @Override
   public void walk() {}
   @Override
   public void fly() {}
}

然后在创建 Flamingo 实例的同时编写这段代码:

WingedAnimal animal = (Flamingo) factory.createAnimal();

您的代码 animal.fly() 将完美运行。

【讨论】:

    【解决方案3】:

    您可以通过泛型使用工厂方法。有几个很好的例子可供使用

    1. C# 中的Here
    2. Here 总是在 C# 中
    3. Here 在 java 中。

    我建议您阅读所有这些内容,以便更好地理解问题和可能的解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多