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

Java 反射+工厂模式实现解耦

程序员文章站 2024-01-24 15:32:46
...

在实际开发中,工厂模式是经常被用到的。

工厂模式的好处:

工厂模式可以达到类的解耦。

工厂类中工厂方法过多也是个问题,每新增一个类,则新增一个工厂方法,这会导致工厂方法过多。恰好,反射可以创建类的实例对象,而且可以采用统一操作Class.forName()产生方法,而不会新增工厂方法。

案例实战


以公司程序员开发业务模块为场景,一个Java程序员开发Java Library,一个Android程序员造*,各自负责相应的工作。

1. 定义程序员的工作行为

每个程序员的工作是共同行为,但不确定具体的工作内容,因此抽象一个work()方法。

package com.xingen.classdemo.factory;

/**
 * Created by ${新根} on 2018/2/16 0016.
 * 博客:http://blog.csdn.net/hexingen
 */
public interface Worker {
    void work();
}

2. 多个程序员快马加鞭的工作

一个android开发人员,专业造*

package com.xingen.classdemo.factory;

/**
 * Created by ${新根} on 2018/2/16 0016.
 * 博客:http://blog.csdn.net/hexingen
 */
public class AndroidDeveloper implements Worker {
    private final  String TAG=AndroidDeveloper.class.getSimpleName();
    public AndroidDeveloper() {
    }

    @Override
    public void work() {
        System.out.println(TAG+" 工作是:android 造*");
    }
}

一个Java开发人员,专业造*

package com.xingen.classdemo.factory;

/**
 * Created by ${新根} on 2018/2/16 0016.
 * 博客:http://blog.csdn.net/hexingen
 */
public class JavaDeveloper implements Worker {
    private final String TAG=JavaDeveloper.class.getSimpleName();
    public JavaDeveloper() {
    }

    @Override
    public void work() {
        System.out.println(TAG+" 工作是:Java 造*");
    }
}

3. 经理抽调程序员,通知那些程序员负责

定义一个工厂类,专门创建类的实例化对象

package com.xingen.classdemo.factory;

/**
 * Created by ${新根} on 2018/2/16 0016.
 * 博客:http://blog.csdn.net/hexingen
 */
public class Factory {
    public static Worker newInstance(String className){
        Worker worker=null;
        try {
          Class< Worker> mClass=  (Class< Worker>)Class.forName(className);
          worker=mClass.newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return worker;
    }
}

4. 项目管控的文档,记录各个模块的负责人

在src文件夹下,创建一个配置文件load.properties。

android=com.xingen.classdemo.factory.AndroidDeveloper
java=com.xingen.classdemo.factory.JavaDeveloper

5. 业务项目计划,从开启到顺利结尾的实施过程

main()程序入口:

public class Client {

    public static void main(String[] args) {
        useFactory();
    }

      /**
     * 反射工厂模式,考虑IO流用异步
     */
    public static void useFactory() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                InputStream inputStream = null;
                try {
                    // 单个/代表当前目录下,详情参考:http://riddickbryant.iteye.com/blog/436693
                    String filePath = "/load.properties";
                    Properties properties = new Properties();
                    inputStream = Client.class.getResourceAsStream(filePath);
                    //加载属性文件
                    properties.load(inputStream);
                    //根据属性文件进行,创建实例
                    Enumeration<String> enumeration = (Enumeration<String>) properties.propertyNames();
                    while (enumeration.hasMoreElements()) {
                        String key = enumeration.nextElement();
                        String values = properties.getProperty(key);
                        Worker worker = Factory.newInstance(values);
                        worker.work();
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (inputStream != null) {
                            inputStream.close();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

}

6. 公司高层看到业务结果

高层看到程序员带来的盈利,笑呵呵!

控制台输出的结果:

AndroidDeveloper 工作是:android 造*

JavaDeveloper 工作是:Java 造*

本案例的项目代码https://github.com/13767004362/JavaDemo/tree/master/ClassDemo