设计模式之工厂模式
2016-03-02 18:44
225 查看
1 . 创建一个接口 就相当于工厂里的模子
2 . 继承生产模型接口的产品类
3 . 工厂加工出来产品
/** * 生产的接口 就相当于模子 */ public interface Person { public void talk(); public void cry(); }
2 . 继承生产模型接口的产品类
/** * 要生产的人 */ public class BlackPerson implements Person { @Override public void talk() { System.out.println("黑人说话"); } @Override public void cry() { System.out.println("黑人哭"); } } /** * 生产出来的人 */ public class YellowPerson implements Person { @Override public void talk() { System.out.println("黄种人说话"); } @Override public void cry() { System.out.println("黄种人哭"); } }
3 . 工厂加工出来产品
/** * 生产工厂 */ public class PersonFactory { private static Person person; private static int rand; //生产人类,根据实现类名单个生产 public static Person createPerson(Class c){ try { //用反射通过类名获得要生产的对象 本例中的:黑人和黄种人 person = (Person) Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return person; } //批量生产 public static Person createPerson(){ //获得这个接口有多少实现的实体类(产品) List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Person.class); Random random = new Random(); if(concreteHumanList.size()!=0){ rand = random.nextInt(concreteHumanList.size()); }else{ return null; } person = createPerson(concreteHumanList.get(rand)); return person; } }
/** * 查找接口所在的包下所有实现的类. */ public class ClassUtils { //给一个接口,返回这个接口的所有实现类 public static List<Class> getAllClassByInterface(Class c){ List<Class> returnClassList = new ArrayList<Class>(); //返回结果 //如果不是一个接口,则不做处理 if(c.isInterface()){ //获得当前的包名 String packageName = c.getPackage().getName(); try { //获得当前包下以及子包下的所有类 List<Class> allClass = getClasses(packageName); //判断是否是同一个接口 for(int i=0;i<allClass.size();i++){ if(c.isAssignableFrom(allClass.get(i))){ //判断是不是一个接口 if(!c.equals(allClass.get(i))){ //本身不加进去 returnClassList.add(allClass.get(i)); } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return returnClassList; } //从一个包中查找出所有的类,在jar包中不能查找 private static List<Class> getClasses(String packageName) throws ClassNotFoundException, IOException { ClassLoader classLoader = Thread.currentThread() .getContextClassLoader(); String path = packageName.replace('.', '/'); Enumeration<URL> resources = classLoader.getResources(path); 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) { classes.addAll(findClasses(directory, packageName)); } return classes; } private static List<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("."); 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; } }
相关文章推荐
- flask源码笔记:三,app.py模块(6)——Flask的方法(上)
- 0302
- 0302思考并回答一些问题
- 几种php解析xml方式
- python学习1
- C++第一次上机实验
- 初入android,android studio熟悉(一)
- flask源码笔记:三,app.py模块(5)——Flask的初始化之__init__函数
- ORA-00845 MEMORY_TARGET not supported on this system
- CentOs图形界面的开启与关闭
- 使用jsonpath解析json内容
- ViewPager + Fragment实现滑动标签页
- 我所经历的大数据平台发展史1:非互联网时代-上篇
- 自定义popupwindow和dialog的区别与使用
- flask源码笔记:三,app.py模块(4)——Flask的初始化之诸多属性
- 简单 看SRL
- 虚幻引擎网络架构——No.0概述
- 冰点下载器在转换pdf的时候出现停止工作
- 0302-我对软件工程的理解
- 0302我的感想