通过反射优化工厂模式
程序员文章站
2024-01-20 15:49:22
...
1.工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=newA() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
2.不足
当增加一个子类的时候需要修改工厂类,这样很麻烦
3.利用反射改进
思路:工厂类通过反新的子类的路径,并使用getInstace()方法来获取一个类的实例。
实现
package com.learn.controller;
public class Factory {
public static void main(String[] as) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
man m = reflectFactory.getInstance("com.learn.controller.Chinese");
System.out.println(m.sayHello());
}
}
interface man {
String sayHello();
}
class Chinese implements man {
public String sayHello() {
return "nihao";
}
}
class Waiguoren implements man {
public String sayHello() {
return "hello";
}
}
class reflectFactory{
public static man getInstance(String mantype) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
man man = null;
man = (man) Class.forName(mantype).newInstance();
return man;
}
}
运行结构如下:
nihao
4.结合属性文件优化
思路: 把所有类的完整路径都写到文件里然后读文件传入工厂类中去只想say()函数
实现:
先假装读到了配置文件保存在了一个数组中,就是下面的mans数组
public class Factory {
static String[] mans = new String[]{
"com.learn.controller.Chinese",
"com.learn.controller.Waiguoren"
};
public static void main(String[] as) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
man m = reflectFactory.getInstance(mans[0]);
System.out.println(m.sayHello());
}
}
运行结果:
你猜【尴尬脸】
5.结合注解优化
待更新