我试图对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的开关,字符串到方法对象的映射等来指定可用披萨的规格,而不是通过任何复杂的,非显而易见的,可能是脆弱的机制来指定。

10-07 19:20
查看更多