为什么80%的码农都做不了架构师?>>>   

先说说场景,一个系统,有几个功能需要用到短信功能,比如登录,忘记密码,更改手机号,更改密码等。那么需要一个接口,统一发送这些短信,从代码重用和抽象的角度来讲,需要实现一个短信积累,具有一些短信的具体功能,并且通过客户端的参数可以自动选择发送内容。

我提供的内容是在原有基础上更改过多次的,先贴出代码,短信鸡肋,他可以存放phone(手机号)和type(短信的具体类别,一般从客户端传来)

public abstract class AbstractMessage {private String phone;private String type;public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getType() {return type;}public void setType(String type) {this.type = type;}AbstractMessage(){super();}AbstractMessage(String type){setType(type);}
}

然后是几个短信子类,他们的特点就是构造方法里调用了setType方法,为什么要这样调用后面再说

public class LoginMessage extends AbstractMessage{public static final String type = "3";LoginMessage(){setType(type);}
}
public class RegisterMessage extends AbstractMessage {public static final String type = "2";RegisterMessage(){setType(type);}
}
public class RememberPasswordMessage extends AbstractMessage {public static final String type = "1";public RememberPasswordMessage() {setType(type);}
}

最后看看工厂方法类,这个类相当于一个工具类,他的create方法可以返回短信实体,从面向对象角度来讲返回值类型为基础类可以让这个方法返回基类的各种子类。

看调用create前,static里的代码就已经被执行完毕了,这个是static的特性,然后里面创建了一个map对象,对象存放了3个键值对,而key就是之前子类的type值,value是子类的class路径,在调用create方法时,会通过客户端传来的type找到map里对应的实体类class路径,然后通过反射创建对象,对象的类型是AbstractMessage的。需要注意的是子类的type必须和客户端传来的type值一样,那样才能正常创建对象,否则会出现异常。其实这个模式的思想就是把短信的创建权利交给客户端,而且如果要新增类只要添加class和在工厂类的static块里多一个put操作,和开闭原则相符,即对新增开放对修改关闭,不过实际开发中并不一定要死报着这个思想,要灵活运用。

public abstract class MessageFactory {private static Map<String,String>messageType;static {messageType = new HashMap<>();messageType.put(RememberPasswordMessage.type,"create.factory.customFactory.RememberPasswordMessage");messageType.put(LoginMessage.type, "create.factory.customFactory.LoginMessage");messageType.put(RegisterMessage.type,"create.factory.customFactory.RegisterMessage");}public static AbstractMessage createMessage(String type){String className = messageType.get(type);try {Class<?> aClass = Class.forName(className);return (AbstractMessage) aClass.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}return null;}
}

转载于:https://my.oschina.net/wwwd/blog/1549285

使用反射建立一个用于生产短信对象的工厂方法相关推荐

  1. 利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

  2. java 发送短信例子_利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

  3. 开发一个发送手机短信的计算机软件

    开发一个发送手机短信的计算机软件 很久以前就有这个想法了,无奈时间有限,资料不足,一直没有成功.昨天突然意念再生,没想到还真搞成功了.接下来我将对这方面的技术做一个总结,并详细介绍我使用的方法细节.我 ...

  4. java实现的一个发送手机短信

    利用java实现的一个发送手机短信的小例子 JAVA发送手机短信,流传有几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注 ...

  5. C#开发终端式短信的原理和方法

    本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也受到各大公司的追捧 ...

  6. C#开发终端式短信的原理和方法 .

    简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星.本 ...

  7. python监控短信_利用Python实现手机短信监控通知的方法

    日常运维工作中,通常是邮件报警机制,但邮件可能不被及时查看,导致问题出现得不到及时有效处理.所以想到用Python实现发短信功能,当监控到问题出现时,短信报警,使问题能得到及时的处理.当然,我相信,用 ...

  8. 普歌-腾讯云短信+使用node发送短信(3种方法API、SDK)、封装工具、搭建web服务、写接口、调用接口发送短信、时效性判断、验证验证码的正确性(下)

    普歌-结合腾讯云短信服务+node搭建一个简单的发送短信web小项目 涉及技术: 腾讯云服务 后端服务:node+express 前端搭建:html+js 前言:本来这篇博客应该很早就发了,中间有一些 ...

  9. 怎么一个好的短信验证码接口接入到自己的企业网站和APP程序当中选择

    文章来源:http://www.4006026717.com 短信验证码平台太多也是一种幸福的烦恼,毕竟好东西太多不知道该如何选也是很麻烦的.那么,如何选择一个好用的平台呢?下面小编为大家提供几个参考 ...

最新文章

  1. 那些年,SDN走过来时的路
  2. vijos 1942 [AH 2005] 小岛
  3. 吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
  4. 测试面试必问点【干货】建议收藏!!
  5. form空白及iframe空白处理
  6. wpsmac历史版本_wps for mac 官方版
  7. 海康威视_摄像头搜索工具
  8. matlab 12脉波变压器,12脉波整流电路MATLAB-Simulink仿真及谐波分析.pdf
  9. elasticsearch报错java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/elas
  10. 计算机上自带的打字游戏,完美运行金山打字通2016(包括自带的小游戏)
  11. Texstudio 与 SumatraPDF双向搜索设置
  12. 鸟哥的linux私房菜_linux磁盘与文件系统管理
  13. Pikachu靶场全关详细教学(一)
  14. shell if -n 参数
  15. 16.355J / ESD.355J 软体工程概念
  16. 一个niubility的Vue游戏,真厉害!
  17. 论语心得 04: 君子之道
  18. 寒湿乃万病之源,温度决定生老病死!
  19. 服务器资源监控工具———node_exporter
  20. java实现自动生成多级目录

热门文章

  1. 提高编写CSS代码效率的10个习惯
  2. mapper 判断条件为null
  3. 使用Nacos项目jar包启动抛出的yml异常
  4. linux右键菜单的截图,Linux: 给右键菜单加一个“转换图片为jpg格式”
  5. oracle查询字段精度,【Oracle】查询字段的长度、类型、精度、注释等信息
  6. 有关java的名句_关于志气的名言名句(精选50句)
  7. 双电阻差分电流采样_小小的采样电阻,还真有点门道!
  8. phpdesigner8 php7.0,大家千万别用PHPDesigner8 的项目替换,多说是泪,改整个站点中!
  9. 大数据技术之kafka (第 3 章 Kafka 架构深入) Zookeeper 在 Kafka 中的作用
  10. IntelliJ IDEA tomcat配置