【发布时间】:2019-10-26 11:34:02
【问题描述】:
我必须根据特定情况创建一个对象。我读到,解决方案可能是工厂模式,但就我而言,它有很多缺点。
例如:我有一个管理动物的应用程序。在某个时候,客户给了我必须创建的动物列表。使用工厂模式的解决方案应该是:
//PRODUCTS
public interface Animal {
String getCall();
}
public class Dog implements Animal {
public String getCall() {
return "Bau";
}
}
public class Cat implements Animal {
public String getCall() {
return "Miao";
}
}
public class Cow {...}
public class Rooster{...}
public enum AnimalEnum {
Cat, Dog, Cow, Rooster
}
//FACTORY
public class AnimalFactory {
public Animal getAnimal (AnimalEnum type){
Animal retval = null;
switch (type){
case Cat:
retval = new Cat();
break;
case Dog:
retval = new Dog();
break;
case Cow:[...]
case Rooster[...]
}
return retval;
}
}
在我看来,这是一种代码味道。问题是我必须写一个案例陈述来检查客户想要什么类型的动物。 此外,如果将来我想创建一个新对象“Tiger”,我必须更改所有工厂类。
我的问题是:有没有办法避免这种情况?有没有一种模式可以让我基于另一个参数创建一个对象,而不需要像那样的“级联 if\case-of”?
我在想,用命令模式,但最后还是出现这种情况。
【问题讨论】:
-
这不是代码异味,这就是工厂模式的工作原理。对此的替代方案是,您的其余代码将不得不担心正在使用哪种特定类型的动物,并且这会扩展到比您当前拥有的代码更难维护的代码。
标签: java if-statement switch-statement factory-pattern creation-pattern