package com.test;interface fruit {
public void eat();
}class apple implements fruit {
@Override
public void eat() {
System.out.println("eat apple");
}
}class orange implements fruit {
@Override
public void eat() {
System.out.println("eat orange");
}
}class Factory { public fruit getFruit(int type) {
//下面的1,2使用常量代替,这里是简写
if (type == 1) {
return new apple();
} else if (type == 2) {
return new orange();
}
return null;
} public fruit getFruit2(String package_class) {
try {
return (fruit) Class.forName(package_class).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}public class test {
public static void main(String[] args) {
Factory fa = new Factory();
fruit f1 = fa.getFruit(1);
f1.eat();
fruit f2 = fa.getFruit2("com.test.apple");
f2.eat();
}
}
如代码所示,当fruit的子类越来越多的时候,我们使用反射,就不用改factory的代码了.
我的问题是:这样子写怎么看怎么2,因为我们传参数的时候一般很少传包名.类名.实际开发中大家都习惯使用哪一种.

解决方案 »

  1.   

    第一种易理解,第二种比较符合面向对象的思想!
    至于你说的问题可以通过一个容器解决:
    比如使用HashTable ( key=apple, value=com.test.apple)一般我们都回使用第二种来实现的 回答完毕
      

  2.   

    在factory模式下,像你这样(public fruit getFruit2(String package_class))写见的不多。通常都是public fruit getFruit2(Class c);然后通过 fruit =(fruit )Class.forName(c.getName()).newInstance();
      

  3.   

    楼上个人觉得太复杂了吧。还不如直接使用
    return (fruit) c.newInstance();
      

  4.   

    =。= 我电脑坏了 。一般是这样,你这里的类名直接从 配置文件里面读的。class Factory {
     String  className="";  //这里类名从配置文件里面读
     public Fruit getFruit() {
        Class c =Class.forName(className);
        fruit=  (Fruit)c.newInstance();
    }
    一般这样写你上面的例子,一般是 举例子才会用到。。
    需要注意的是  Fruit的子类必须实现 无参构造方法