我试图对PizzaFactory类的代码使用反射,以便删除if else条件并使代码更具动态性。但是我不知道怎么做。
Pizza.java
package PizzaTrail;
import java.util.List;
//this is the main abstract factory which will be extended by the concrete factory
public abstract class Pizza { public abstract List fetchIngredients(String Type); }
PizzaFactory.java
package PizzaTrail;
import java.util.List;
//this is the concrete factory
public class PizzaFactory extends Pizza
{
public static Pizza getConcretePizza(String PType)
{
Pizza p=null;
if (PType.equals("Cheese"))
{
p=new CheesePizza();
} else if (PType.equals("Pepperoni"))
{
p=new PepperoniPizza();
}
else if (PType.equals("Clam"))
{
p = new CalmPizza();
}
else if (PType.equals("Veggie"))
{
p= new VeggiePizza();
}
return(p);
}
}
ChessePizza.java
package PizzaTrail;
import java.util.ArrayList;
import java.util.List;
public class CheesePizza extends Pizza {
List ing = new ArrayList();
@Override
public List fetchIngredients(String Type)
{
ing.add("Ingredient : Shredded Mozzarella Cheese");
ing.add("Ingredient : Peppers");
ing.add("Ingredient : Feta cheese");
ing.add("Ingredient : Pesto");
return (ing);
}
}
}
谁能帮助我获得在PizzaFactory类中使用的反射,以便我可以动态调用类CheesePizza等?
最佳答案
为了减少``if-else''的使用率来回答您的问题,您可以动态确定要使用的类,例如代替
if (PType.equals("Cheese")) {
p=new CheesePizza();
你可以用
Class.forName(PType + "Pizza").newInstance(); // might need a package
(以上假设一个无参数的构造函数)
这样就可以消除任何交换式行为。
但是我不建议这样做。上面的代码很难调试且不明显。您的IDE可能会将此类标记为未使用,并且可能在将来的重构期间将其标记为删除。在绝大多数情况下,我希望澄清。
简而言之,我宁愿通过if / else序列,基于String的开关,字符串到方法对象的映射等来指定可用披萨的规格,而不是通过任何复杂的,非显而易见的,可能是脆弱的机制来指定。