gpt4 book ai didi

java - 如何避免工厂类中的 "cascading if\case"语句

转载 作者:行者123 更新时间:2023-11-29 04:06:06 26 4
gpt4 key购买 nike

我必须根据特定情况创建一个对象。我读到,解决方案可能是工厂模式,但就我而言,它有很多缺点。

例如:我有一个管理动物的应用程序。在某个时候,一位客户给了我一份必须创建的动物 list 。使用工厂模式的解决方案应该是:

//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”?

本来想用命令模式,结果还是这样。

最佳答案

“代码味道”及其对立面“整洁代码”的概念可以追溯到 Martin Fowler 和 Robert Martin,有关 olfactory, hygienic 的细微差别,请参阅此帖子和 moral simile在软件开发领域。

关于这个问题,您认为这种切换枚举很糟糕的想法与 Martin Fowler 在“Refactoring: Improving the Design of Existing Code”的原始版本中一致,但他在 2015 edition 中收回了它.对此没有达成共识,在几个 100K 声誉贡献者中也没有达成共识,例如@tim-biegeleisen 宣称没有臭味,@mark-seemann insists that there is , 也是在 2015 年以后,只要宇宙存在就必然如此,根据他的倾向。

由于您对那段特定代码感到不满,您可以将实例创建移动到枚举本身,从而避免 switch 语句,也避免在扩充枚举时忘记添加额外的 switch 分支。

public enum AnimalEnum {
Cat(Cat::new),
Dog(Dog::new),
Cow(Cow::new),
Rooster(Rooster::new);

private final Supplier<Animal> createAnimal;

public Animal createInstance() {
return createAnimal.get();
}

AnimalEnum(Supplier<Animal> factory) {
this.createAnimal = factory;
}
}

预计该提案将基于个体嗅觉器官的配置并围绕气味/清洁二分法引起争议,我想引用 this post仅致力于这个问题,作为枚举成员的功能是否会以合理的方式激怒我们。

关于java - 如何避免工厂类中的 "cascading if\case"语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58570377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com