打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
2.3.4 可配置的简单工厂

2.3.4 可配置的简单工厂

现在已经学会通过简单工厂来选择具体的实现类了,可是还有问题。比如,在现在的实现中,再新增加一种实现,该怎么办呢?

那就需要修改工厂类,才能把新的实现添加到现有的系统中。比如现在新增加了一个实现类Impl3,那么就需要类似下面这样来修改工厂类:

  1. public class Factory {
  2. public static Api createApi(int type){
  3. Api api = null;
  4. if(type==1){
  5. api = new Impl();
  6. }else if(type==2){
  7. api = new Impl2();
  8. }
  9. else if(type==3){
  10. api = new Impl3();
  11. }
  12. return api;
  13. }
  14. }

每次新增加一个实现类都来修改工厂类的实现,肯定不是一个好的实现方式。那么现在希望新增加了实现类过后不修改工厂类,该怎么办呢?

一个解决的方法就是使用配置文件,当有了新的实现类后,只要在配置文件里面配置上新的实现类即可。在简单工厂的方法里面可以使用反射,当然也可以使用IoC/DI(控制反转/依赖注入,这个不在这里讨论)来实现。

下面来看看如何使用反射加上配置文件,来实现添加新的实现类后,无须修改代码,就能把这个新的实现类加入应用中。

(1)配置文件用最简单的properties文件,实际开发中多是xml配置。定义一个名称为"FactoryTest.properties"的配置文件,放置到Factory同一个包下面,内容如下:

  1. ImplClass=cn.javass.dp.simplefactory.example5.Impl

如果新添加了实现类,修改这里的配置即可,就不需要修改程序了。

(2)此时的工厂类实现如下:

  1. /**
  2. * 工厂类,用来创建Api对象
  3. */
  4. public class Factory {
  5. /**
  6. * 具体创建Api的方法,根据配置文件的参数来创建接口
  7. * @return 创建好的Api对象
  8. */
  9. public static Api createApi(){
  10. //直接读取配置文件来获取需要创建实例的类
  11. //至于如何读取Properties,还有如何反射在这里就不解释了
  12. Properties p = new Properties();
  13. InputStream in = null;
  14. try {
  15. in = Factory.class.getResourceAsStream(
  16. "FactoryTest.properties");
  17. p.load(in);
  18. } catch (IOException e) {
  19. System.out.println(
  20. "装载工厂配置文件出错了,具体的堆栈信息如下:");
  21. e.printStackTrace();
  22. }finally{
  23. try {
  24. in.close();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. //用反射去创建,那些例外处理等完善的工作这里就不做了
  30. Api api = null;
  31. try {
  32. api = (Api)Class.forName(p.getProperty("ImplClass"))
  33. .newInstance();
  34. } catch (InstantiationException e) {
  35. e.printStackTrace();
  36. } catch (IllegalAccessException e) {
  37. e.printStackTrace();
  38. } catch (ClassNotFoundException e) {
  39. e.printStackTrace();
  40. }
  41. return api;
  42. }
  43. }

(3)此时的客户端就变得很简单了,不再需要传入参数,代码示例如下:

  1. public class Client {
  2. public static void main(String[] args) {
  3. Api api = Factory.createApi();
  4. api.test1("哈哈,不要紧张,只是个测试而已!");
  5. }
  6. }

把上面的示例代码输入到电脑里面,测试一下,体会体会。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
(五) 实现简单工厂
jndi和rmi的集成。
API Design
Commons Logging 的使用方法
Java Properties 类读取配置文件信息
java 工厂模式简单介绍及例子
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服