三更半夜随便来点代码提提神~ 懒人写Factory

本文介绍了一种使用Java实现的服务工厂模式,通过该模式可以高效地管理和创建采购路由相关的服务实例。具体包括如何通过反射机制加载指定包下的所有实现类,并缓存这些服务的实例,以便后续快速获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package org.jc.buss.pur.route;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import org.jc.common.utils.Keys;
import org.jc.utils.InstanceUtil;

public class PurRouteFactory {

    private static final String PACKAGENAME = "org.jc.buss.pur.route.impl";

    private static Map<String, PurRouteSrv> cache = new ConcurrentHashMap<>();

    static {
        List<PurRouteSrv> classList = null;
        try {
            // 获取PACKAGENAME目录下PurRouteSrv类型实例
            classList = InstanceUtil.getInstance(PurRouteSrv.class, PACKAGENAME);
        } catch (Exception e) {
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("PurRouteFactory 启动失败!!!!");
            System.exit(0);
        }
        for (PurRouteSrv srv : classList) {
            srv.init();
            cache.put(srv.getAirCode(), srv);
            System.out.println(srv.getClass() + " init ok.");
        }
    }

    public static PurRouteSrv get(String airCode) {
        PurRouteSrv srv = cache.get(airCode);
        return srv;
    }

    public static Set<String> airs() {
        return cache.keySet();
    }
}
package org.jc.buss.pur;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.jc.utils.InstanceUtil;

public class PurServiceFactory {

    private static final String PACKAGENAME = "org.jc.buss.pur";

    private static Map<String, Class<?>> cache = new ConcurrentHashMap<>();

    static {
        try {
            // 获取PACKAGENAME目录下PurService类型Class
            List<Class<?>> classList = InstanceUtil.getClass(PurService.class, PACKAGENAME);
            for (Class<?> clazz : classList) {
                PurService purService = (PurService) clazz.newInstance();
                cache.put(purService.getAirCode(), clazz);
                System.out.println(purService.getClass() + " init ok.");
            }
        } catch (Exception e) {
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("PurRouteFactory 启动失败!!!!");
            System.exit(0);
        }
    }

    public static IPurService get(String airCode) {
        Class<?> clazz = cache.get(airCode);
        Object obj = null;
        try {
            obj = clazz.newInstance();
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        }
        return (IPurService) obj;
    }
}
package org.jc.utils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.jc.buss.pur.PurService;

public class InstanceUtil {

    public static <T> List<Class<?>> getClass(Class<T> clazz, String packageName)
            throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        List<Class<?>> result = new ArrayList<Class<?>>();

        String _packageName = packageName;
        String packageDirName = _packageName.replace('.', '/');

        Enumeration<URL> dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
        while (dirs.hasMoreElements()) {
            URL url = dirs.nextElement();
            List<File> fileList = getFiles(url.getPath(), true);
            if (null != fileList && !fileList.isEmpty()) {
                for (File file : fileList) {
                    String className = file.getAbsolutePath().substring(file.getAbsolutePath().indexOf("classes") + 8)
                            .replaceAll(".class", "").replaceAll("\\\\", ".").replaceAll("/", ".");
                    try {
                        Class<?> instance = Class.forName(className, false,
                                Thread.currentThread().getContextClassLoader());
                        if (!clazz.isAssignableFrom(instance) || clazz == instance) {
                            continue;
                        }
                        result.add(instance);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                }
            }
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    public static <T> List<T> getInstance(Class<T> clazz, String packageName)
            throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        List<T> result = new ArrayList<T>();

        List<Class<?>> classList = getClass(clazz, packageName);
        if (null != classList && !classList.isEmpty()) {
            for (Class<?> c : classList) {
                result.add((T) c.newInstance());
            }
        }

        return result;
    } 

    public static List<File> getFiles(String path, boolean isAddDirectory) {
        List<File> list = new ArrayList<>();
        getFiles(list, path, isAddDirectory);
        return list;
    }

    public static List<File> getFiles(List<File> list, String path, boolean isAddDirectory) {
        File baseFile = new File(path);
        if (baseFile.isFile() || !baseFile.exists()) {
            return list;
        }
        File[] files = baseFile.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                if (isAddDirectory) {
                    getFiles(list, file.getAbsolutePath(), isAddDirectory);
                }
            } else {
                list.add(file);
            }
        }
        return list;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jc_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值