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,因为我们传参数的时候一般很少传包名.类名.实际开发中大家都习惯使用哪一种.
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,因为我们传参数的时候一般很少传包名.类名.实际开发中大家都习惯使用哪一种.
解决方案 »
- int转16进制
- win7下无法执行nbtstat.exe命令获取网卡地址?
- Statement中方法的疑问
- 我用FileUpload上传文件,在Tomcat中可以使用,可是到了weblogic就不能用了
- 极度郁闷中,各位高手救命啊!关于数据库查询的古怪问题
- 在用西门子TC35I发送中文短信时,能在超级终端中发送成功,在程序中确发不成功,为什么?
- 紧急求助,我想获得当前的日期值,和三个月后的日期值,请各位帮忙,谢谢
- 在sco unix或linux 安装j2sdk-1_3_1_09-linux-i586.bin 出现以下错误
- 请教:如何获取IP地址等
- JNative调用回调函数问题(WIN7)
- JMF怎么实现视频和声音文件格式的转换
- 关于字符串处理的一个问题。。
至于你说的问题可以通过一个容器解决:
比如使用HashTable ( key=apple, value=com.test.apple)一般我们都回使用第二种来实现的 回答完毕
return (fruit) c.newInstance();
String className=""; //这里类名从配置文件里面读
public Fruit getFruit() {
Class c =Class.forName(className);
fruit= (Fruit)c.newInstance();
}
一般这样写你上面的例子,一般是 举例子才会用到。。
需要注意的是 Fruit的子类必须实现 无参构造方法