(设计模式)简单工厂模式之通过配置文件动态创建实现类
来源:互联网 发布:疯狂的美工装修助 编辑:程序博客网 时间:2024/05/22 18:22
通常我们在使用简单工厂模式的时候会由创建方法create通过传入的参数来判断要实例化哪个对象,就像下面这样:
public static class ImageSelectFactory { public static IImageSelect createIImageSelect(ImageSelectClientMode mode) { IImageSelect imageSelect = null; if (mode == ImageSelectClientMode.COLLECTION_IMAGE) { imageSelect = new CollectionImage(); } else if (mode == ImageSelectClientMode.LOCAL_PHOTO) { imageSelect = new LocalPhoto(); } else if (mode == ImageSelectClientMode.WORKS_IMAGE) { imageSelect = new WorksImage(); } else if (mode == ImageSelectClientMode.TAKE_PHOTO) { imageSelect = new TakePhoto(); } else if (mode == ImageSelectClientMode.SUPER_IMAGE_LIB) { imageSelect = new SuperImageLib(); } return imageSelect; } }这里面定义了5个IImageSelect接口的子类,通过定义好的泛型ImageSelectClientMode来决定实例化哪个子类,现在遇到这么一个问题,如果添加到第6个子类的话,那就必须要更改ImageSelectFactory类以及枚举ImageSelectClientMode,可能你会说“改一下又何妨?”,虽不说影响不影响什么开闭设计原则,但是有个情况你可成想到,你这个类要打包发布给别人用呢?别人在没有源码的情况下如何扩展呢?这里就需要我们动态的通过配置文件来加载实现类了。
实现的基本思路为:通过读取本地的.properties文件来获取我们需要实例化的类,然后通过反射来生成对象,这样当你把发布出去的时候,使用者只用更改配置文件就可以让工厂去实例化自己后来才写的实现类,我们看看实现方式:
ImageSelectClient.properties:
COLLECTION_IMAGE=com.kongfuzi.student.support.bitmap.select.CollectionImageLOCAL_PHOTO=com.kongfuzi.student.support.bitmap.select.LocalPhotoWORKS_IMAGE=com.kongfuzi.student.support.bitmap.select.WorksImageTAKE_PHOTO=com.kongfuzi.student.support.bitmap.select.TakePhotoSUPER_IMAGE_LIB=com.kongfuzi.student.support.bitmap.select.SuperImageLib
public static class ImageSelectFactory { public static IImageSelect createIImageSelect(String type) { IImageSelect mIImageSelect; //实例化Properties对象,用于读取.properties Properties properties = new Properties(); InputStream is = null; try { is = ImageSelectClient.class.getResourceAsStream("ImageSelectClient.properties"); //装载ImageSelectClient.properties文件 properties.load(is); } catch (Exception e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } try { //根据key获取value,value即为将要实例化的类 Class<?> aClass = Class.forName(properties.getProperty(type)); //使用反射进行实例化 mIImageSelect = (IImageSelect) aClass.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return mIImageSelect; } }
这样,我们就可以随便实现子类,然后在.properties文件中添加对应的包路径,然后通过ImageSelectFactory就可以进行实例化了。
0 0
- (设计模式)简单工厂模式之通过配置文件动态创建实现类
- 设计模式 02 创建类模式之简单工厂模式
- java 设计模式-创建模式之简单工厂模式
- 设计模式之创建模式----简单工厂模式
- java设计模式 -------- 创建模式 之 简单工厂模式
- java设计模式之创建型模式-简单工厂模式
- 设计模式01之 简单工厂模式(创建模式)
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- 设计模式之简单工厂C++实现
- 通过例子学设计模式之--简单工厂模式以及使用场景说明(C++实现)
- 设计模式之简单工厂(创建型模式)
- java设计模式(创建型)之简单工厂模式
- 创建型设计模式之简单工厂模式SimpleFactory
- 设计模式-创建型之简单工厂模式
- 研磨设计模式之创建模式:简单工厂
- 设计模式 之简单工厂+ 工厂模式
- Java设计模式之工厂模式之简单工厂模式(通过反射)
- exp/imp expdp/impdp乱码
- java.sql.Date 和java.util.Date 互转
- 计算几何与图形学有关的几种常用算法(二)
- spring mvc 图形验证码
- hdu 5533(几何水)
- (设计模式)简单工厂模式之通过配置文件动态创建实现类
- ReactionCocoa 登陆界面
- 初学者编了个象棋程序,工程完成度百分之九十五,跟大家分享下,希望下一步能做个图形界面,欢迎交流
- HDU 3068 最长回文 Manacher
- 解决eclipse快捷键冲突问题和修改eclipse快捷键
- 从”JAVA“而终 12:java集合框架API讲解
- hadoop技术原理
- Android入门---ImageView(图像视图)
- 分治法之合并排序(C实现)