我是设计模式的新手,现在我正在学习工厂方法模式。我试着用动物做一个例子。
我有一个带有两个方法的Animal接口,呼吸和行走。实现这个接口我有两个类,Giraffe和Flamingo。
遵循这个模式,我有两个工厂,一个用于长颈鹿,另一个用于Flamingos,还有一个主类如下所示:
if (color.equals("yellow")) {
  factory = new GiraffeFactory();
} else {
  factory = new FlamingoFactory();
}
Animal animal = factory.createAnimal();
animal.breathe();
animal.walk();这很好用,但现在我意识到火烈鸟可以飞了。我不想在Animal接口中包含这个方法,因为长颈鹿不能。
我如何只在Flamingo Animal实例中调用这个新方法?cast是唯一的解决方案吗?或者,此模式仅适用于具有来自其接口的相同方法的对象?
((Flamingo) animal).fly();非常感谢。
发布于 2018-05-21 19:04:25
这个模式的用法没有多大意义,关键是你不知道你会得到哪个Animal的实现(职责分离),所以使用这些知识是完全反模式的。你可以创建一个新的Winged接口或者其他东西,然后让Flamingo实现它。然后你就可以随时检查了。记住,蝙蝠在想到名字时也会飞;)
if (animal instanceof Winged) {
    Winged winged = (Winged) animal;
    winged.fly();
}发布于 2018-05-22 17:09:31
您可以创建另一个名为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()将完美地工作。
https://stackoverflow.com/questions/50447383
复制相似问题