工廠模式實現簡介:
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; } }