有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中扩展工厂方法模式中的类

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

我有一个动物界面,有两种方法,呼吸和行走。实现这个接口我有两个类,Giraffe和Flamingo

按照这种模式,我有两个工厂,一个是长颈鹿工厂,一个是火烈鸟工厂,还有一个主要的分类如下:

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

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

这非常有效,但现在我意识到火烈鸟能飞。我不想在动物界面中使用这种方法,因为长颈鹿不能

我怎样才能在Flamingo动物的实例中调用这个新方法?cast是唯一的解决方案吗?或者,这种模式仅适用于从接口具有相同方法的对象

((Flamingo) animal).fly();

非常感谢


共 (3) 个答案

  1. # 1 楼答案

    可以使用泛型使用s工厂方法。这里有几个很好的例子

    1. ^C#中的{a1}
    2. Here总是在C#
    3. ^java中的{a3}

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

  2. # 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();
    

    你的密码动物。fly()将非常有效

  3. # 3 楼答案

    这个模式的使用没有多大意义,关键是你不知道你会得到什么样的动物实现(责任分离),所以使用这些知识是完全反模式的。你可以制作一个新的界面,让Flamingo实现它。然后你可以随时查看。记住,蝙蝠在想到名字时也会飞;)

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