設計模式之工廠模式

工廠模式實現簡介:

1.工廠模式定義了統一的接口和衆多實現類,工廠模式生成實現類對象的方式是通過定義的ClassUtils中靜態方法getAllClassByInterface(Class c)實現的,

1.首先獲傳入的接口全路徑包名  // c.getPackage().getName();

2.通過類加載機制獲取列表文件信息

3.通過文件信息反射創建類對象

代碼示例如下:

1.接口Human

2.接口實現類:(這裏只貼出一個其他類實現方式相同)

3.工廠的實現

public class FactoryHuman {
    public static Human createHuman(Class c) {
        Human human = null;
        try {
            human = (Human)Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return human;
    }

    public static Human createHuman(){
        Human human = null;
        List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Human.class);
        Random random = new Random();
        int rand = random.nextInt(concreteHumanList.size());

        human = createHuman(concreteHumanList.get(rand));
        return human;
    }
}

4.重要實現類ClassUtils

public class ClassUtils {
    // 通過接口獲得類集合
    public static List<Class> getAllClassByInterface(Class c)  {
        List<Class> returnClassList = new ArrayList<Class>();
        if (c.isInterface()){
            String packageName = c.getPackage().getName();
            System.out.println(packageName);
            try {
                List<Class> allClass = null;
                try {
                    allClass = getClasses(packageName);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                for (int i = 0 ;i<allClass.size();i++){
                    if (!c.equals(allClass.get(i))){
                        returnClassList.add(allClass.get(i));
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return returnClassList;
    }
    // 獲取類集合
    private static List<Class> getClasses(String packageName) throws IOException, ClassNotFoundException {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        System.out.println(packageName+"----------------");
        String path = packageName.replace(".","/");
        System.out.println("path :"+ path);
        Enumeration<URL> resources = classLoader.getResources(path);
        System.out.println("resource = "+resources);
        List<File> dirs = new ArrayList<File>();
            while (resources.hasMoreElements()){
                URL resource = resources.nextElement();
                dirs.add(new File(resource.getFile()));
            }
            ArrayList<Class> classes = new ArrayList<Class>();
            for (File directory :dirs){
                System.out.println("directory : "+directory);
                classes.addAll(findClasses(directory,packageName));
        }
            return classes;
    }

    // 根據目錄、包名反射得到類
    private static Collection<? extends Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>();
        if (!directory.exists()){
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()){
                assert !file.getName().contains(".");//斷言 判斷語法爲真 若爲false則 拋出異常
                classes.addAll(findClasses(file,packageName+"."+file.getName()));
            }else if (file.getName().endsWith(".class")){
                classes.add(Class.forName(packageName+"."+file.getName().substring(0,file.getName().length() - 6)));
             }
        }
        return classes;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章