如何在Java中扩展Factory Method模式中的类

时间:2018-05-21 10:58:30

标签: java design-patterns factory-method

我是设计模式的新手,现在我正在学习Factory Method模式。我试着用动物做个例子。

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

按照模式,我有两个工厂,一个用于长颈鹿,一个用于火烈鸟,一个主要类别:

dict

这完美无缺,但现在我意识到火烈鸟可以飞。我不想在Animal界面中包含此方法,因为Giraffes不能。

如何仅在Flamingo Animal实例中调用此新方法?是铸造唯一的解决方案吗?或者这种模式仅适用于具有相同方法的对象?

# create some data       
>>> import random
>>> a = [random.randint(0, 3) for _ in range(20)]
>>> b = [random.randint(0, 3) for _ in range(20)]
>>> 
>>> a
[0, 3, 2, 1, 2, 0, 1, 2, 0, 2, 1, 1, 0, 3, 1, 3, 1, 2, 3, 2]
>>> b
[1, 0, 3, 2, 2, 2, 2, 3, 1, 2, 1, 1, 1, 1, 3, 0, 0, 0, 3, 3]
>>> 
# this one line is all we need
>>> au, bu = zip(*dict.fromkeys(zip(a, b)))
>>> 
# admire
>>> au
(0, 3, 2, 1, 2, 0, 1, 3, 1, 1, 2, 3)
>>> bu
(1, 0, 3, 2, 2, 2, 1, 1, 3, 0, 0, 3)

非常感谢你。

3 个答案:

答案 0 :(得分:1)

使用这种模式并不是很有意义,重点是你不知道你将获得什么样的动物实施(责任分离),所以这将是一个完全的反...模式使用知识。你可以创建一个新的Winged界面,然后让Flamingo实现它。然后你可以随时检查。记住蝙蝠在想到名字的时候也会飞;)

public ResponseEntity<Cart> readCart( 
                @ApiParam(value = "Cart ID", required = true) @ExternalRefParam Long cartId,  HttpServletRequest request )

答案 1 :(得分:0)

您可以创建另一个名为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()将完美运行。

答案 2 :(得分:0)

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

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

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