首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中扩展工厂方法模式中的类

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

Stack Overflow用户
提问于 2018-05-21 18:58:30
回答 3查看 1K关注 0票数 0

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

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

遵循这个模式,我有两个工厂,一个用于长颈鹿,另一个用于Flamingos,还有一个主类如下所示:

代码语言:javascript
运行
复制
if (color.equals("yellow")) {
  factory = new GiraffeFactory();
} else {
  factory = new FlamingoFactory();
}

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

这很好用,但现在我意识到火烈鸟可以飞了。我不想在Animal接口中包含这个方法,因为长颈鹿不能。

我如何只在Flamingo Animal实例中调用这个新方法?cast是唯一的解决方案吗?或者,此模式仅适用于具有来自其接口的相同方法的对象?

代码语言:javascript
运行
复制
((Flamingo) animal).fly();

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2018-05-21 19:04:25

这个模式的用法没有多大意义,关键是你不知道你会得到哪个Animal的实现(职责分离),所以使用这些知识是完全反模式的。你可以创建一个新的Winged接口或者其他东西,然后让Flamingo实现它。然后你就可以随时检查了。记住,蝙蝠在想到名字时也会飞;)

代码语言:javascript
运行
复制
if (animal instanceof Winged) {
    Winged winged = (Winged) animal;
    winged.fly();
}
票数 1
EN

Stack Overflow用户

发布于 2018-05-22 17:09:31

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

代码语言:javascript
运行
复制
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实例时编写以下代码:

代码语言:javascript
运行
复制
WingedAnimal animal = (Flamingo) factory.createAnimal();

您的代码animal.fly()将完美地工作。

票数 0
EN

Stack Overflow用户

发布于 2021-01-13 13:38:08

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

C#

  1. Here总是java中的C#
  2. Here

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50447383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档