我必须根据特定情况创建一个对象。我读到解决方案可能是“工厂模式”,但就我而言,它有很多缺点。
例如:我有一个管理动物的应用程序。在某个时候,客户给我列出了必须创建的动物清单。使用工厂模式的解决方案应为:
//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”对象,则必须更改所有工厂类。
我的问题是:有办法避免这种情况吗?有一种模式可以让我基于另一个参数创建对象,而无需像“ cascade-if \ case-of”那样?
我当时想使用命令模式,但最后仍然有这种情况。
“代码气味”的概念及其对立的“干净的代码”可以追溯到Martin Fowler和Robert Martin,有关软件开发领域中olfactory, hygienic和moral simile的细微差别,请参见此文章。有关体现为厌恶的道德判断的讨论,请参见this,也可以从历史的角度解释卫生与道德的接近,例如,参见。 this和this。