欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过反射优化工厂模式

程序员文章站 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.结合注解优化

待更新