我是设计模式的新手,现在我正在学习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)
非常感谢你。
答案 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)